Xml 查找子节点的值
好的,这是一个相当基本的问题,但我对Perl还不熟悉,老实说,我似乎在任何地方都找不到答案,尽管我相信答案会非常简单 假设我有以下XML模式:Xml 查找子节点的值,xml,perl,xml-parsing,xml-libxml,Xml,Perl,Xml Parsing,Xml Libxml,好的,这是一个相当基本的问题,但我对Perl还不熟悉,老实说,我似乎在任何地方都找不到答案,尽管我相信答案会非常简单 假设我有以下XML模式: <root> <parentNode status="Good"> <A> <B> <value><![CDATA[This is my value]]</value> &l
<root>
<parentNode status="Good">
<A>
<B>
<value><![CDATA[This is my value]]</value>
</B>
</A>
</parentNode>
</root>
但当我尝试时:
my $val = $node->findvalue("value");
我什么也得不到
此外,我真的只是对“这是我的价值”部分感兴趣。读取值时,CDATA是否会影响它?您的XPath需要是隐式的 而不是使用:
my$val=$node->findvalue(“value”)代码>
您应该使用:$val=$node->findvalue('./A/B/value')代码>
你应该成功:D
复制您的代码(并将CDATA固定为右括号)
并改用上述代码段:
$ ./test2.pl
Found the value: This is my value
$
XPath
是的缩写
child::value
这意味着查找名为value
的节点,该节点是上下文节点的子节点。如果要搜索后代,则需要
descendant::value
也就是说人们写的是
.//value
通过构造适当的XPath表达式来查找所需的值
元素,这非常简单
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>
是的,就是这样。非常感谢。
.//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