3

わかりました、これはかなり初歩的な質問ですが、私はPerlに不慣れであり、ばかばかしいほど単純であると確信しているにもかかわらず、正直なところどこにも答えを見つけることができないようです。

次のXMLスキーマがあるとしましょう。

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

ステータスが異なる複数のparentNodeが存在するとします。

ステータスが「良好」ではない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は値にまったく影響しますか?

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 に答える