我正在尝试使用'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)。
答案 0 :(得分:2)
因为它们不是同一个节点。就像名称所说,它检查两个节点是否是同一个节点。您似乎认为它会检查两个节点是否相同,但这不是它的作用。