Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 查找子节点的值_Xml_Perl_Xml Parsing_Xml Libxml - Fatal编程技术网

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

好的,这是一个相当基本的问题,但我对Perl还不熟悉,老实说,我似乎在任何地方都找不到答案,尽管我相信答案会非常简单

假设我有以下XML模式:

<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