Perl LibXML:isSameNode方法

时间:2013-11-19 00:18:54

标签: 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'测试显然是MATCHES(同样精确的findnodes&amp; xpath表达式)。 但是第二个或第三个'isSameNode'测试都没有使用'parsed_balance_chunk'中的节点。这是一个简单的东西,我忽略了语法或只是我不能这样比较两个节点?如果没有,比较两个节点的方法是什么?我最终试图确定xml文件中是否已存在xml代码块(即来自先前的parsed_balance_chuck)。

1 个答案:

答案 0 :(得分:2)

因为它们不是同一个节点。就像名称所说,它检查两个节点是否是同一个节点。您似乎认为它会检查两个节点是否相同,但这不是它的作用。