比较 XML 忽略元素顺序

Posted

技术标签:

【中文标题】比较 XML 忽略元素顺序【英文标题】:Compare XML ignoring element order 【发布时间】:2016-02-15 04:05:17 【问题描述】:

使用 XMLUnit 2 如何在不考虑元素顺序的情况下比较两个文档?

我收到了this question for XMLUnit 1,但显然 v2 中的新 API 不再具有上述方法。

这是我当前的代码:

Diff diff = DiffBuilder.compare(expected)
            .withTest(actual)
            .ignoreComments()
            .ignoreWhitespace()
            .checkForSimilar()
            .build();

assertFalse(diff.hasDifferences());

编辑 Stefan Bodewigs 评论:

这是我与上面的 sn-p 比较的两个字符串:

String expected = "<root><foo>FOO</foo><bar>BAR</bar></root>";
String actual = "<root><bar>BAR</bar><foo>FOO</foo></root>";

报告的差异

Expected element tag name 'foo' but was 'bar' - comparing <foo...> at /root[1]/foo[1] to <bar...> at /root[1]/bar[1] (DIFFERENT)
Expected text value 'FOO' but was 'BAR' - comparing <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] to <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] (DIFFERENT)
Expected element tag name 'bar' but was 'foo' - comparing <bar...> at /root[1]/bar[1] to <foo...> at /root[1]/foo[1] (DIFFERENT)
Expected text value 'BAR' but was 'FOO' - comparing <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] to <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] (DIFFERENT)

【问题讨论】:

默认情况下,新 API 应该忽略元素顺序(这是 DifferenceEvaluators.DEFAULT 所做的)。您确定这是您看到的差异,而不是其他任何东西吗? 我复制了 OP 的问题,即使我添加了 .checkForSimilar()。这似乎与github.com/xmlunit/user-guide/wiki/… 的文档相反,添加下面描述的 .withNodeMatcher() 解决了问题。 【参考方案1】:

在 2.x 文档中可能需要更清楚的一个区别是默认的 ElementSelector - 大致是 1.x 中的 ElementQualifier。其中 1.x 默认按名称匹配元素,2.x 默认按顺序匹配元素。也许这是个坏主意。

如果您切换到匹配元素名称,您的 Diff 应该可以工作。

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

【讨论】:

谢谢你,斯特凡! @stefan...如果节点位于 xml 文件中的不同位置,这会起作用吗? 取决于不同的含义。它适用于相同父元素的兄弟姐妹。否则,您需要确保在考虑元素本身之前将“正确的父”元素相互比较。 XMLUnit 从文档树的根开始并选择要比较的分支,一旦一个分支被选择为“匹配”,XMLUnit 将根本不会查看其他分支。 您可能需要使用 github 问题。

以上是关于比较 XML 忽略元素顺序的主要内容,如果未能解决你的问题,请参考以下文章

XML 反序列化忽略不按字母顺序排列的属性

maven-surefire-plugin 忽略 pom.xml 中的插件顺序

比较两个文件忽略顺序

比较引用类型对象的集合是不是相等,忽略集合中项目的顺序

比较具有忽略项目顺序的切片字段的结构与stretchr/testify

在Java中测试两个JSON对象的相等性忽略子顺序[关闭]