Perl-XML::LibXML-获取具有特定属性的元素



我有个问题,希望有人能帮忙。。。

我有以下示例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: $datan";
}

预期输出:

达米安·康威Tom Christiansen

但我没有得到任何回报。

我认为这将匹配"book"元素中任何"author"元素的文本内容,该元素还包含属性"width"为145的"image"元素。

我确信我在这里忽略了一些非常明显的东西,但我无法弄清楚我做错了什么。

感谢

你差不多到了。请注意,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";
}

[乔洛巴的答案中的建筑]

在插值$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";
    }
}

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

相关内容

  • 没有找到相关文章

最新更新