嗨:我正在尝试比较 perl 中的两个 XML 文件,并希望使用已经发明的东西来做到这一点。我发现的最有希望的候选者是 XML::SemanticDiff。但是在寻找差异时,它似乎对顺序敏感。举个例子,这是我的 perl 脚本...
#!/usr/bin/env perl
use strict;
use XML::SemanticDiff;
my $diff = XML::SemanticDiff->new();
my $file1 = "xml1.xml";
my $file2 = "xml2.xml";
foreach my $change ($diff->compare($file1, $file2)) {
print "$change->{message} in context $change->{context}\n";
}
exit;
这里是 xml1.xml 和 xml2.xml ...
xml1.xml
<forest name="sterling">
<species name="oak">
<number value="10000"> </number>
<avg_age value="200"> </avg_age>
<type name="deciduous"> </type>
</species>
<species name="pine">
<number value="15000"> </number>
<avg_age value="180"> </avg_age>
<type name="coniferous"> </type>
</species>
</forest>
xml2.xml
<forest name="sterling">
<species name="pine">
<number value="15000"> </number>
<avg_age value="180"> </avg_age>
<type name="coniferous"> </type>
</species>
<species name="oak">
<number value="10000"> </number>
<avg_age value="200"> </avg_age>
<type name="deciduous"> </type>
</species>
</forest>
内容相同,但树的顺序在两者之间交换。perl 脚本返回...
Attribute 'name' has different value in element 'species'. in context /forest[1]/species[1]
Attribute 'value' has different value in element 'avg_age'. in context
/forest[1]/species[1]/avg_age[1]
Attribute 'value' has different value in element 'number'. in context
/forest[1]/species[1]/number[1]
Attribute 'name' has different value in element 'type'. in context
/forest[1]/species[1]/type[1]
Attribute 'name' has different value in element 'species'. in context /forest[1]/species[2]
Attribute 'value' has different value in element 'avg_age'. in context
/forest[1]/species[2]/avg_age[1]
Attribute 'value' has different value in element 'number'. in context
/forest[1]/species[2]/number[1]
Attribute 'name' has different value in element 'type'. in context
/forest[1]/species[2]/type[1]
当然,如果物种的顺序相同,它不会返回任何内容。
有没有办法让这个订单不可知,或者有一个不同的下午可以做我想做的事吗?
此外,这必须能够识别在其中一个 xml 文件中找到但在另一个文件中丢失的元素。
如果有的话,我对非 perl 解决方案持开放态度。
谢谢 !