3

ここで何かがおかしいようです。

以下の例では、XPath クエリ ( ) を介してテキスト ノードにアクセスしています//book/isbn/text()。メソッドの使用text()を強制する必要があります。XML::LibXMLXML::LibXML::Text

ただし、親ノードに到達するには、メソッドを 2 回呼び出して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>

そう:

  • //isbn//isbn/text()が同じノードであると仮定して、XML ノードの私の理解は間違っていますか、または
  • XML::LibXMLこれはのparentNodeメソッドのバグですか?
4

1 に答える 1

2

XML ドキュメントの各要素はノードです。その要素にテキスト (例: <isbn>019328373476</isbn>) が含まれる場合、それはその要素の (要素ではなくテキスト型の) 子ノードです。

XML::LibXML の parentNode メソッドのバグではありません。

于 2011-08-28T17:52:20.987 に答える