如何在XML中获取父节点的父节点

时间:2014-05-14 09:31:19

标签: xml perl parent

我正在使用XML :: Parser来解析不同的XML文件并将其内容放入数据库中。由于文件的结构可能因文件而异,因此我无法对代码中的任何节点名称进行硬编码。在某些时候,我需要知道父节点的父节点。有可能以某种方式得到它吗?

这是我目前的剧本:

use XML::Parser;
use XML::Parser::Nodes;
use DBI qw(:sql_types);
use Error qw(:try);

my %var;

my $filename='x.xml';

my $parser=XML::Parser->new(Style=>'Nodes', Handlers=>{
  Init => \&handle_doc_start
  , Final => \&handle_doc_end
  , Start=>\&handle_start
  , End=>\&handle_end
  , Char=>\&handle_char
  , Default=>\&handle_default });
$parser->parsefile( $filename );

sub handle_doc_start { }
sub handle_doc_end { }

sub handle_start {
  my($expat,$element,%attrs) = @_;

  my $row_id=$expat->element_index;
  my $depth=$expat->depth;
  my $parent=$expat->current_element;

  if (defined($var{$parent.$element.$depth})) { $var{$parent.$element.$depth}++; }
  else { $var{$parent.$element.$depth}=1; }

  # write the tags/elements data into the database

  if(%attrs) {
    while (my ($key,$value)=each(%attrs)) {
      # write the attributes into the database
    }
  }
}

sub handle_end {}

sub handle_char {
  my ($expat,$data) = @_;
  my $row_id=$expat->element_index;

  chomp $data;
  $data=~ s/^\s+//; $data=~ s/\s+$//;

  if (defined($data) && ($data ne '')) {
    # write the values into the database
  }
}

sub handle_default {}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您是否尝试过context方法?

context
           Returns a list of element names that represent open elements, with
           the last one being the innermost. Inside start and end tag handlers,
           this will be the tag of the parent element.
顺便说一句,我不确定混合XML :: Parser :: Nodes和处理程序是个好主意。由于XML :: Parser :: Nodes声明了自己的处理程序(主要是重用XML :: Parser的树样式处理程序),我强烈怀疑你的处理程序或XML :: Parser :: Nodes'被忽略了。如果你的处理程序运行,那么看起来你可以摆脱XML :: Parser :: Nodes。