这里似乎有些奇怪。
在下面的示例中,我通过 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/