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

标签 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 是我对 XML 节点的理解不正确吗?和 //isbn/text()是同一个节点,或者
  • 这是 XML::LibXML 中的错误吗?的 parentNode方法?

最佳答案

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

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

关于XML::LibXML 的文本节点父节点概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222637/

相关文章:

perl - Marpa 解析器库是否支持错误恢复?

regex - 我应该使用正则表达式来查找 XML 命名空间定义吗?

SQL Server XQuery 修改

java - 如何避免 com.thoughtworks.xstream.io.StreamException : Cannot create XmlPullParser while deseriliazation?

perl 传递散列引用未按预期运行

xml - 在保留格式的同时从文件读取 XML 和从文件读取 XML

WPF,在 TreeView 中显示属性值而不是节点名称

java - 警告 : No mapping found for HTTP request with URI [/mvc/add] in DispatcherServlet with name 'dispatcherservlet'

xml - XPath 表达式中的 Perl 变量

xpath - 这是一个有效的 XPath 表达式吗?