检查 XML 文件是否相等,忽略元素顺序

问题描述 投票:0回答:1

考虑以下 xml 内容:

var xml1 = """
      <root>
          <elem1>
            <elem2 attr="a"/>
          </elem1>
          <elem1>
            <elem2 attr="b"/>
          </elem1>
      </root>
    """;
    
var xml2 = """
      <root>
          <elem1>
            <elem2 attr="b"/>
          </elem1>
          <elem1>
            <elem2 attr="a"/>
          </elem1>
      </root>
    """;

我正在尝试编写一个测试来证明它们是相等的。 为此,我使用 XMLUnit

这是测试代码:

assertThat(xml1, isSimilarTo(xml2)
        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText)));

我也尝试过

assertThat(xml1, isSimilarTo(xml2)
        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes)));

但没有成功。 我发现一篇文章讨论了同样的问题: https://www.insystems.nl/blog/testing-for-equality-of-xml-files-having- Different-ordering-of-nested-elements/

但是该解决方案需要了解 XML 结构。

是否有另一种方法 - 以相同的方式重新排序/排序两个 XML 文件中的元素,然后进行比较?如果是这样,有没有图书馆可以做到这一点?我试过这个 https://stackoverflow.com/a/68798089/971355但它也没有帮助(似乎不是在所有级别对元素进行排序)

java xml xmlunit
1个回答
0
投票

XML 文件中元素的顺序是否无关紧要取决于其上下文。

如果我们查看 DocBook 文档的 XML 文件,更改

<para>
元素的顺序肯定会改变文本的含义,并且两个版本不再相等。

另一方面,对于几个XML格式的配置文件,元素的顺序根本不相关。

但是元素的属性顺序在我所知道的所有上下文中都是无关紧要的;无论您按字母顺序排序还是按长度排序或根本不排序都没有区别,解释总是相同的:

<elem attr1="ab" attr2="ba" />

等于

<elem attr2="ba" attr1="ab" />

这意味着不会有任何通用解决方案能够确定两个 XML 文件在语义上是否相等;如果当前没有适合您的特殊类型的 XML 文件,您必须创建自己的。

© www.soinside.com 2019 - 2024. All rights reserved.