好的,这是一个非常基本的问题,但我是Perl的新手,老实说,我无法在任何地方找到答案,即使我确信它会非常简单。
假设我有以下XML架构:
<root>
<parentNode status="Good">
<A>
<B>
<value><![CDATA[This is my value]]</value>
</B>
</A>
</parentNode>
</root>
假设将有多个具有不同状态的parentNodes。
我正在尝试编写一个脚本,它将为我提供parentNodes的每个值节点的内容,其中status不是“Good”
使用以下代码,我已经能够成功获取正确的parentNodes:
my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($xml_file);
my $root = $tree->getDocumentElement;
my @records = $root->findnodes("//parentNode");
foreach my $node (@records) {
my $resultAtt = $node->getAttribute('status');
next if $resultAtt ne "Good";
但是当我尝试时:
my $val = $node->findvalue("value");
我一无所获。
另外,我真的只对“这是我的价值”部分感兴趣。当您读取该值时,CDATA是否会对其产生影响?
答案 0 :(得分:2)
你的XPath需要隐含。
而不是使用:my $val = $node->findvalue("value");
你应该使用:$val = $node->findvalue('./A/B/value');
你应该有成功:D
复制代码(并修复CDATA以使其具有关闭角括号) 并使用上面的代码片段:
$ ./test2.pl
Found the value: This is my value
$
答案 1 :(得分:1)
的XPath
value
是
的缩写child::value
表示查找名为value
的节点,该节点是上下文节点的子节点。如果你想搜索后代,你想要
descendant::value
这意味着人们写为
.//value
答案 2 :(得分:0)
通过制作适当的XPath表达式来查找所需的value
元素,这非常简单
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml(IO => \*DATA);
for my $value ($xml->findnodes('/root/parentNode[@status != "Good"]//value') ) {
print $value->textContent, "\n";
}
__DATA__
<root>
<parentNode status="Good">
<A>
<B>
<value><![CDATA[This is my value]]></value>
</B>
</A>
</parentNode>
<parentNode status="Not Good">
<A>
<B>
<value><![CDATA[This is another value]]></value>
</B>
</A>
</parentNode>
</root>
This is another value