perl 的 XML::SemanticDiff 可以硬塞到两个 XML 文件的顺序不可知比较中吗?

Posted

技术标签:

【中文标题】perl 的 XML::SemanticDiff 可以硬塞到两个 XML 文件的顺序不可知比较中吗?【英文标题】:Can perl's XML::SemanticDiff be shoehorned into order agnostic comparisons of two XML files? 【发布时间】:2021-10-01 18:21:11 【问题描述】:

嗨:我正在尝试在 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]

当然,如果物种的顺序相同,它不会返回任何内容。

有没有办法让这个订单不可知,或者有一个不同的 pm 可以做我想要的? 此外,这必须能够识别在其中一个 xml 文件中找到但在另一个文件中丢失的元素。

如果有的话,我愿意接受非 perl 解决方案。

谢谢!

【问题讨论】:

【参考方案1】:

在运行比较之前,请考虑按属性对 xml 文件进行排序。我找到了一个项目,可以让你做到这一点here。如果您需要自动化解决方案,使用 XML::LibXML 应该不会太难。

我在 SuperUser 上找到了 similar question。

【讨论】:

以上是关于perl 的 XML::SemanticDiff 可以硬塞到两个 XML 文件的顺序不可知比较中吗?的主要内容,如果未能解决你的问题,请参考以下文章

以后没有 Perl 6 了!Perl 之父同意改名

Perl 之父同意 Perl 6 改名为 Raku

Perl 的 rpm 版本不同于“perl -v”

Perl模块推荐23——Perl::Shell

Perl基础速成

Perl语言入门