Perl LibXML : isSameNode method

标签 perl libxml2

我正在尝试使用“isSameNode”比较两个节点。然而,其中一个节点是通过“parse_balanced_chunk”创建的。来自 http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isSameNode文档中说“此方法提供了一种方法来确定实现返回的两个 Node 引用是否引用同一对象。”

所以我想知道它是否没有像我预期的那样工作,因为它们确实来自两个不同的来源(一个来自解析的txt文件,另一个来自parse_balance_chunk)?

这是“test_in.xml”和代码:

<?xml version="1.0"?>
<TT>
 <A>ZAB</A>
 <B>ZBW</B>
 <C>
  <D>
   <E>ZSE</E>
   <F>ZLC</F>
  </D>
 </C>
 <C>
  <K>
   <H>dog</H>       
   <E>one123</E>       
   <M>bird</M>       
  </K>
 </C>
</TT>

use warnings;
use strict;
use XML::LibXML;

my $parser = XML::LibXML->new({keep_blanks=>(0)});
my $dom = $parser->load_xml(location => 'test_in.xml') or die;

#called in scalar context ($na1)
my ($na1) = $dom->findnodes('//D');
my ($na2) = $dom->findnodes('//D');
my $X1 = $na1->isSameNode($na2); ##MATCHES

my ($frg) = $parser->parse_balanced_chunk ("<D><E>ZSE</E><F>ZLC</F></D>");
my $X2 = $na1->isSameNode($frg); ##WHY NO MATCH?

my ($na3) = $frg->findnodes('//D');
my $X3 = $na1->isSameNode($na3); ##WHY NO MATCH?

print "SAME?: $X1\n";
print "SAME?: $X2\n";
print "SAME?: $X3\n";

输出:

SAME?: 1
SAME?: 0
SAME?: 0

因此,第一个“isSameNode”测试显然匹配(完全相同的 findnodes 和 xpath 表达式)。 但是第二个或第三个“isSameNode”测试都无法使用“parsed_balance_chunk”中的节点进行工作。我在语法中忽略了一些简单的事情,还是只是我无法以这种方式比较两个节点?如果不是,比较两个节点的方法是什么?我最终试图确定 xml 文件中是否已存在 xml 代码块(即来自先前的 parsed_balance_chuck)。

最佳答案

因为它们不是同一个节点。正如名称所示,它检查两个节点是否是同一节点。您似乎认为它检查两个节点是否相等,但这不是它的作用。

关于Perl LibXML : isSameNode method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20060713/

相关文章:

c - 从 xmlNode 获取源文件名?

regex - ?+* 在正则表达式中没有任何内容

Perl XML::LibXML: findnode vs. findvalue vs. find - 有什么区别?

linux - 以不同的用户身份运行 cgi 脚本

xslt - 如何从 xsltproc 输出 iso-8859-1 字符集?

ruby-on-rails - Nokogiri 是针对 LibXML 版本 2.9.1 构建的,但已动态加载 2.8.0

c# - 获取 DNA 子串的原始顺序

Perl 频率排序和其他东西

c++ - 在 libXML sax 解析器(C++)中获取属性值的正确方法是什么?

ruby - 在 OSX 10.9 Maverick 上安装 Nokogiri 时出错?