如何访问由XML :: Parser创建的解析树?

时间:2010-08-04 06:56:35

标签: xml perl

我有一个数组引用,里面有一些数组引用。嵌套数组引用还包含数组引用。 (这是treeXML::Parser样式。)

my $Filename = "sample.xml";

my $Parser = new XML::Parser( Style => 'tree' );

my $Tree = $Parser->parsefile( $Filename );

这里$Tree是数组引用,它将是数组引用,内容和嵌套深度都取决于xml文件。我想遍历嵌套数组$Tree并打印内容。

2 个答案:

答案 0 :(得分:5)

这是一个简单的版本:

use strict;
use warnings;

sub printElement
{
  my ($tag, $content) = @_;

  if (ref $content) {
    # This is a XML element:
    my $attrHash = $content->[0];

    print "<$tag>";           # I'm ignoring attributes

    for (my $i = 1; $i < $#$content; $i += 2) {
      printElement(@$content[$i, $i+1]);
    }

    print "</$tag>";
  } else {
    # This is a text pseudo-element:
    print $content;             # I'm not encoding entities
  }
} # end printElement

sub printTree
{
  # The root tree is always a 2-element array
  # of the root element and its content:
  printElement(@{ shift @_ });
  print "\n";
}

# Example parse tree from XML::Parser:
my $tree =
    ['foo', [{}, 'head', [{id => "a"}, 0, "Hello ",  'em', [{}, 0, "there"]],
             'bar', [ {}, 0, "Howdy",  'ref', [{}]],
             0, "do"
            ]
    ];

printTree($tree);

这不会打印属性,但您可以通过$attrHash访问它们。它也不对文本中的实体进行编码,因此生成的输出可能不会是格式良好的XML。我将这些作为练习留给读者。 : - )

答案 1 :(得分:1)

Data::Walk可能就是你要找的东西。您也可以使用Universal手动执行此操作。