Perl LibXML: метод isSameNode

Я пытаюсь сравнить два узла, используя 'isSameNode'. Однако один из узлов создается через "parse_balanced_chunk". Из документа http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isSameNode говорится: "Этот метод предоставляет способ определить, возвращаются ли ссылки на два узла по ссылке реализации тот же объект ".

Поэтому я удивляюсь, что это не работает, как я ожидал бы, потому что они действительно происходят из двух разных источников (один из проанализированного txt файла, другой из parse_balance_chunk)?

Вот "test_in.xml" и код:

<!--?xml version="1.0"?-->
<tt>
 ZAB
 <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 & xpath выражение). Но ни один из 2-го или 3-го тестов isSameNode не работает с использованием узла из parsed_balance_chunk. Является ли это чем-то простым, я игнорирую синтаксис или это просто, что я не могу сравнивать два узла таким образом? Если нет, то каков метод сравнения двух узлов? Waht. В конечном итоге я пытаюсь определить, существует ли в xml файле блок кода xml (т.е. Из предыдущего parsed_balance_chuck).

1 ответ

Потому что они не одни и те же узлы. Как и имя говорит, он проверяет, являются ли два узла одним и тем же узлом. Кажется, вы думаете, что он проверяет, эквивалентны ли два узла, но это не то, что он делает.

licensed under cc by-sa 3.0 with attribution.