考虑以下 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但它也没有帮助(似乎不是在所有级别对元素进行排序)
XML 文件中元素的顺序是否无关紧要取决于其上下文。
如果我们查看 DocBook 文档的 XML 文件,更改
<para>
元素的顺序肯定会改变文本的含义,并且两个版本不再相等。
另一方面,对于几个XML格式的配置文件,元素的顺序根本不相关。
但是元素的属性顺序在我所知道的所有上下文中都是无关紧要的;无论您按字母顺序排序还是按长度排序或根本不排序都没有区别,解释总是相同的:
<elem attr1="ab" attr2="ba" />
等于
<elem attr2="ba" attr1="ab" />
这意味着不会有任何通用解决方案能够确定两个 XML 文件在语义上是否相等;如果当前没有适合您的特殊类型的 XML 文件,您必须创建自己的。