转储 XML::LibXML 个元素

dump XML::LibXML elements

我想转储 xml 文档树,类似于转储 perl 数据类型的方式。

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

递归转储$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' );

我想要一棵 Lib 树 XML - 代表 XML 结构的元素。

您可以使用 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;
}

走树将不透明结构转换为可倾倒的结构。

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('/*')
);