如何读取整个XML节点

时间:2017-06-13 16:36:49

标签: xml perl libxml2 xml-libxml

我的XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:element name="foo">
<xsl:value-of select="bar"/>
</xsl:element>
</xsl:stylesheet>

我正在使用XML:LibXML :: Reader并尝试在满足某些条件时在每个节点上执行逻辑。例如:

<xsl:element name="foo">

输出:

<xsl:element name="foobar">

以下是我目前的情况:

use strict;
use warnings;
use XML::LibXML::Reader;

my $reader = XML::LibXML::Reader->new(location => "test.xml") or die "cannot read input file\n";

while ($reader->read){
    processNode($reader);
}

sub processNode{
    my $reader = shift;
    printf "%s\n", ($reader->name);
}

我的输出如下:

xsl:stylesheet
#text
xsl:element
#text
xsl:value-of
#text
xsl:element
#text
xsl:stylesheet

1 个答案:

答案 0 :(得分:1)

好的,这里的问题是 - 你基本上误解了XML的树性质。你已经拥有了一大堆节点 - 那就是你“走路”&#34;&#39;但实际上xsl:stylesheet节点是xsl:element节点的父节点。

到目前为止,最简单的方法是按照你的方式去做,而是:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::LibXML;

my $reader = XML::LibXML->load_xml(location => "test.xml") or die "cannot read input file\n";
print $reader -> toString

但我非常确定您的要求稍微复杂一些。

编辑:果然,确实如此。

所以 - 改变每一个&#39; foo&#39;命名为&foffar&#39; foobar&#39;名:

 #!/usr/bin/env perl

use strict;
use warnings;
use XML::LibXML;

my $reader = XML::LibXML->load_xml(location => "test.xml") or die "cannot read input file\n";
my $xpath_context = XML::LibXML::XPathContext->new($reader);

foreach my $foo_node ( $xpath_context -> findnodes('//xsl:element[@name="foo"]') ) {
  $foo_node -> setAttribute ( 'name', 'foobar' );
}

print $reader -> toString