Perl 使用XML::Twig,如何检查两个节点是否具有完全相同的子节点和属性?

Perl 使用XML::Twig,如何检查两个节点是否具有完全相同的子节点和属性?,perl,xml-parsing,perl-module,xml-twig,Perl,Xml Parsing,Perl Module,Xml Twig,下面是一个简短的XML文件,其中有两个节点具有相同的子节点(但有两个不同的值) 迈阿密5000英镑 7777用于节点华盛顿 <country id="USA"> <city id="MIAMI" method="modify"> <attributes> <number_people>5000</number_people> <average_income>40</average

下面是一个简短的XML文件,其中有两个节点具有相同的子节点(但有两个不同的值)

迈阿密5000英镑

7777用于节点华盛顿

<country id="USA">
<city id="MIAMI" method="modify">
    <attributes>
        <number_people>5000</number_people>
        <average_income>40</average_income>
    </attributes>
</city>

<city id="WASHINGTON" method="modify">
    <attributes>
        <number_people>7777</number_people>
        <average_income>40</average_income>

    </attributes>
 </city>
</country>
关于模块,递归地比较两个perl数据结构很有帮助


我查看了模块XML::Twig的文档,您可以使用方法
simplify
获得任何Twig对象的结构。那么,拥有7777人的第三个城市洛杉矶会与华盛顿一样吗?它们的名称不同,因此数据结构也可能不同。我认为需要比较的是实际城市数据结构的孩子们。是的,你是对的。这就是为什么我尝试使用$M->children。但是它似乎不包含属性值看到元素包装在“attributes”节点中很有趣要以
$t->first_elt('MIAMI')
开始将不会检索节点MIAMI,您需要使用
$t->first_elt('city')
,然后
$M->children
返回子节点列表或在标量上下文中,当你测试的时候,孩子的数量。为什么它会包含子元素的文本值?@mirod right,这是一个类型错误(我使用虚拟名称,因为我无法发布原始数据)。如果可能的话,我会更正问题代码,我更喜欢使用Perl::Twig中的内置方法。如果我必须转储两个节点,您认为我必须使用:$M->simplify,$W->simplify,然后使用Data::Compare来比较$M和$W吗?我建议您尝试一下。但是,由于对象只不过是一个受欢迎的数据结构,它可能只与
$M->children
一起工作,而不是与
$W->children
@fxzuz一起工作,您在找到解决方案方面帮了很多忙`my$ATR=$Y1->simplify();my$ATRIB=$Y2->simplify();my$z1=自卸车($ATR);my$z2=自卸车($ATRIB);如果($z1 eq$z2){print“\n NODES_attributes EQUALS”;}`请注意,我不知道是否存在使用纯细枝的解决方案(这里我们使用Data::Dumper)。我们不需要使用children方法(simplify是递归的)
#!/usr/bin/perl -w
use warnings;
use XML::Twig;

my $t= XML::Twig->new;
my $v= XML::Twig::Elt->new;

$t-> parsefile ('file.xml');
my $M=$t->first_elt('city');            # retrieve node MIAMI 
my $W=$M->next_sibling('city');    # retrieve node WASHINGTON


if ($M->children eq $W->children) {print "the two nodes are exactly IDENTICAL"; }