3

好的,这是一个非常初级的问题,但我是 Perl 的新手,老实说,我似乎无法在任何地方找到答案,即使我确信它会非常简单。

假设我有以下 XML 模式:

<root>
    <parentNode status="Good">
        <A>
            <B>
                <value><![CDATA[This is my value]]</value>
            </B>
        </A>
    </parentNode>
</root>

假设将有多个具有不同状态的父节点。

我正在尝试编写一个脚本,该脚本将为我提供状态不是“好”的父节点的每个值节点的内容

使用以下代码,我已经能够成功获得正确的父节点:

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 是否会影响它?

4

3 回答 3

2

您的 XPath 需要是隐式的。

而不是使用 :my $val = $node->findvalue("value"); 你应该使用:$val = $node->findvalue('./A/B/value');

你应该成功了:D

复制您的代码(并将 CDATA 修复为具有右尖括号)并改用上面的代码片段:

$ ./test2.pl 
Found the value: This is my value
$
于 2013-01-25T01:45:30.987 回答
1

XPath

value

简称

child::value

这意味着寻找一个名为的节点value,它是上下文节点的子节点。如果你想搜索一个后代,你想要

descendant::value

这意味着人们写成

.//value
于 2013-01-25T03:13:39.767 回答
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
于 2015-07-02T16:38:26.323 回答