Здесь что-то кажется странным.
В приведенном ниже примере я обращаюсь к текстовым узлам через запрос XPath (//book/isbn/text()
). text()
необходим, чтобы заставить XML::LibXML
позволить мне использовать XML::LibXML::Text
методы.
Чтобы добраться до родительского узла, я должен дважды вызвать метод parentNode
, чтобы получить истинный родительский узел (<book>
в данном случае):
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->new->parse_string( << 'MAIN' );
<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>
</library>
MAIN
foreach my $isbn ( $xml->findnodes( '//book/isbn/text()' ) ) {
# Do something with $isbn->setData()
my $book = $isbn->parentNode->parentNode; # My daddy's daddy is my daddy?
print $book->toString;
}
выход
<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>
Итак:
- мое понимание узлов XML неверно, если предположить, что
//isbn
и //isbn/text()
- это один и тот же узел, или
- Это ошибка в методе
XML::LibXML
parentNode
?