1

私は誰かが助けてくれることを望んでいる問題を抱えています...

次の例の xml 構造があります。

<library>
    <book>
       <title>Perl Best Practices</title>
       <author>Damian Conway</author>
       <isbn>0596001738</isbn>
       <pages>542</pages>
       <image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif"
            width="145" height="190" />
    </book>
    <book>
       <title>Perl Cookbook, Second Edition</title>
       <author>Tom Christiansen</author>
       <author>Nathan Torkington</author>
       <isbn>0596003137</isbn>
       <pages>964</pages>
       <image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif"
            width="145" height="190" />
    </book>
    <book>
       <title>Guitar for Dummies</title>
       <author>Mark Phillips</author>
       <author>John Chappell</author>
       <isbn>076455106X</isbn>
       <pages>392</pages>
       <image src="http://media.wiley.com/product_data/coverImage/6X/0750/0766X.jpg"
           width="100" height="125" />
    </book>
</library>

動作するはずだと思ったコード:

use warnings;
use strict;

use XML::LibXML;

my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file('/path/to/xmlfile.xml');

my $width = "145";

my $query = "//book/image[\@width/text() = '$width']/author/text()";

foreach my $data ($xmldoc->findnodes($query)) {
    print "Results: $data\n";
}

期待される出力:

ダミアン・コンウェイ トム・クリスチャンセン

しかし、何も返されません。

これは、値が 145 の属性「width」を持つ「image」要素も含む「book」要素内の「author」要素のテキスト コンテンツと一致すると考えました。

私はここで非常に明白な何かを見落としていると確信していますが、私が間違っていることを解決することはできません.

あなたの助けは大歓迎です

4

3 に答える 3

4

あなたはほとんどそこにいました。authorの子ではないことに注意してimageください。属性には text() の子がありません。その値を文字列と直接比較できます。また、toString参照の代わりに値を出力する必要があります。

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file('1.xml');

my $width = "145";

my $query = "//book[image/\@width = '$width']/author/text()";

foreach my $data ($xmldoc->findnodes($query)) {
    print "Results: ", $data->toString, "\n";
}
于 2013-08-15T09:36:41.443 に答える
1

【ちょろばさんの答えを組み立てる】

補間するのが安全でない状況$width(たとえば、 が含まれている可能性がある場合') では、次を使用できます。

for my $book ($xmldoc->findnodes('/library/book')) {
    my $image_width = $book->findvalue('image/@width');
    next if !$image_width || $image_width ne '145';

    for my $data ($book->findnodes('author/text()')) {
        print "Results: ", $data->toString, "\n";
    }
}
于 2013-08-15T14:53:49.567 に答える
0

XML 属性にはテキスト ノードがないため$query"//book/image[\@width='$width']/author/text()"

于 2013-08-15T09:38:19.903 に答える