dump XML :: LibXML元素

时间:2018-03-23 13:22:38

标签: perl xml-libxml

我想转储xml doc树,类似于可以转储perl数据类型的方式。

use Data::Dumper;
print Dumper($foo);

Recursivly转储$foo包含的结构(即使存在循环依赖关系)。

然而

use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc    = $parser->parse_file($filename);
my @nodes  = $doc->findnodes($path);
foreach(@nodes)
{
    print Dumper($_);
}

只需打印

等内容
$VAR1 = bless( do{\(my $o = 46232224)}, 'XML::LibXML::Element' );

我想得到一个LibXML树 - 代表XML结构的元素。

2 个答案:

答案 0 :(得分:4)

您可以使用LibXML::Nodeserialize方法:

use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc    = $parser->parse_file($filename);
my @nodes  = $doc->findnodes($path);
foreach my $node (@nodes)
{
    print $node->serialize;
}

答案 1 :(得分:3)

走树,将不透明结构转换为可转储结构。

use XML::LibXML qw(:libxml);
use Data::Visitor::Callback qw();

my $v = Data::Visitor::Callback->new(
    'XML::LibXML::Text' => sub {
        my ($v, $node) = @_;
        return ($node->nodeValue =~ qr/\S/)
            ? {
                n => $node->nodeName,
                t => $node->nodeType,
                v => $node->nodeValue,
            }
            : (); # skip whitespace text nodes
    },
    'XML::LibXML::Element' => sub {
        my ($v, $node) = @_;
        return {
            c => [grep $_, $v->visit($node->childNodes)],
            n => $node->nodeName,
            t => $node->nodeType,
        };
    },
);

use DDP; p $v->visit(
    XML::LibXML->new->parse_file('foo.xml')->findnodes('/*')
);