XML :: LibXML понятие родителя текстового узла - PullRequest
3 голосов
/ 28 августа 2011

Здесь что-то кажется странным.

В приведенном ниже примере я обращаюсь к текстовым узлам через запрос 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?

1 Ответ

2 голосов
/ 28 августа 2011

Каждый элемент в документе XML является узлом.Если этот элемент содержит текст (например, <isbn>019328373476</isbn>), то это дочерний узел (типа text, в отличие от элемента) этого элемента.

Это не ошибка в методе parentNode XML :: LibXML.

...