XML :: LibXML的文本节点父级的概念

时间:2011-08-28 17:35:55

标签: xml perl xml-libxml

这里看起来很奇怪。

在下面的示例中,我通过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>

所以:

    假设//isbn//isbn/text()是同一个节点,
  • 是我对XML节点的理解不正确,或者
  • 这是XML::LibXMLparentNode方法中的错误吗?

1 个答案:

答案 0 :(得分:2)

XML文档中的每个元素都是一个节点。如果该元素包含文本(例如<isbn>019328373476</isbn>),则它是该元素的子节点(类型为text,而不是元素)。

这不是XML :: LibXML的parentNode方法中的错误。