Perl的 - XML ::的libxml - 具有特定属性的元素越来越(Perl - XML:

2019-10-18 12:26发布

我有我希望有人能帮助一个问题...

我有以下示例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的值的“图像”元素的“书”元素中匹配的“作者”元素的文本内容。

我敢肯定,我俯瞰东西很明显这里,但可以不知道是什么,我做错了。

你的帮助是非常赞赏谢谢

Answer 1:

你是几乎没有。 只需注意author是不是一个孩子image 。 属性没有文本()的孩子,你可以直接与字符串比较它们的值。 此外, 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";
}


Answer 2:

[大厦choroba的答案]

在一个情况下它是不安全的插值$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";
    }
}


Answer 3:

XML属性没有文本节点,所以你的$query应该是"//book/image[\@width='$width']/author/text()"



文章来源: Perl - XML::LibXML - getting elements that have certain attributes