4

当您有不同顺序的父节点时,我遇到了问题。例如:

示例 XML1

<level1>
   <name>FirstParent</name>
   <level2>
        <somefield>AAA</somefield>
   </level2>
   <level2>
        <somefield>BBB</somefield>
   </level2>       
</level1>
<level1>
   <name>SecondParent</name>
   <level2>
        <somefield>CCC</somefield>
   </level2>
   <level2>
        <somefield>DDD</somefield>
   </level2>
</level1>

示例 XML2

<level1>
   <name>SecondParent</name>
   <level2>
        <somefield>DDD</somefield>
   </level2>
   <level2>
        <somefield>CCC</somefield>
   </level2>
</level1>
<level1>
   <name>FirstParent</name>
   <level2>
        <somefield>BBB</somefield>
   </level2>
   <level2>
        <somefield>AAA</somefield>
   </level2>          
</level1>

当我调试 RecursiveElementNameAndTextQualifier 时,我看到它将 FirstParent 作为 controlnode,将 SecondParent 作为 testnode。因此,可以正确得出节点不同的结论。但是我需要将 FirstParent 和 SeconParent 与另一个文件中的正确匹配进行比较。

所以,似乎我需要先对更高级别的节点进行排序(?)。

有人知道我该如何克服吗?我应该以不同的方式检查/修改/实施什么以将正确的父母串联传递给 ElementQualifier ?

也许,有了正确的方向,我可以开发所需的东西。

4

4 回答 4

1

您需要考虑拾取文档的相同分支所必需的条件。根据您的描述,您想比较这两个level1元素的顺序交换。听起来好像您想通过查看name嵌套在其中的第一个子元素的文本内容来识别匹配对。仅在此文本上,仅此而已。

这不是什么RecursiveElementNameAndTextQualifier。它比较所有子元素的元素名称和嵌套文本。而且由于somefield交换了元素的顺序,因此您要比较的节点不符合条件。

您会看到 XMLUnitlevel1按顺序选择元素,因为当根本没有找到匹配的节点对时,它会回退到这样做。如果你设置compareUnmatchedfalse你会得到CHILD_NODE_NOT_FOUND差异。

在 XMLUnit 1.x(2.x 尚未发布)中,您必须编写一个ElementQualifier嵌入您自己需要的逻辑的程序,没有内置功能ElementQualifier可以完全满足您的需求。

于 2015-10-08T04:46:01.757 回答
1

您尚未指定是使用 XMLUnit 1 还是 2,但在版本 2 (2.0.0-alpha-04) 和使用 DiffBuilder 时我遇到了这个问题。解决方案是构造 Diff,将非默认 ElementSelector 传递给 Default Matcher:

import org.xmlunit.diff.Diff;
import org.xmlunit.builder.DiffBuilder;
import org.xmlunit.diff.ElementSelectors;
import org.xmlunit.diff.DefaultNodeMatcher;

. . .

Diff diff = DiffBuilder.
            compare(myExpectedResultXmlObj).
            withTest(myCompareToXmlObj).
            withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)). 
            build();

Assert.assertFalse(diff.toString(), diff.hasDifferences());

关键部分是 withNodeMatcher 行。

于 2016-03-31T16:15:31.487 回答
0

您需要提供自己的ElementQualifier实现。RecursiveElementNameAndTextQualifier可能会将一个文档中的相同元素与另一个文档中的多个元素进行匹配。

于 2015-10-07T15:32:56.187 回答
0

对我来说,我还需要checkForSimilar()DiffBuilder.

没有它,断言是错误的,说节点的顺序不一样(子列表中的位置不一样)

我的代码是:

Diff diff = DiffBuilder
    .compare(myExpectedResultXmlObj)
    .withTest(myCompareToXmlObj)
    .checkForSimilar()
    .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
    .build();
于 2017-03-23T10:40:29.243 回答