当你有不同顺序的父节点时,我遇到了一个问题。例如:
样本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 ?
也许,有了正确的方向,我可以开发所需的
您需要考虑获取文档相同分支所需的条件。从您的描述中,您想比较两个level1
元素与其交换的顺序。听起来好像您想通过查看嵌套在其中的第一个name
子元素的文本内容来识别匹配对。只有这段文字,没有其他。
这不是RecursiveElementNameAndTextQualifier
所做的。它比较所有子元素的元素名称和嵌套文本。并且由于交换了somefield
元素的顺序,因此您想要比较的节点不符合条件。
您可以看到XMLUnit按顺序选择level1
元素,因为当根本没有找到匹配的节点对时,它会返回到这样做。如果你设置compareUnmatched
为false
,你会得到CHILD_NODE_NOT_FOUND
的差异。
在XMLUnit 1。x(2。x还没有发布,但是)你必须写一个ElementQualifier
嵌入你需要自己的逻辑,没有内置的ElementQualifier
做你想要的。
您没有指定您是使用XMLUnit 1还是2,但是在版本2 (2.0.0-alpha-04)和使用DiffBuilder时我遇到了这个问题。解决方案是构造Diff,将一个非默认的ElementSelector传递给默认匹配器:
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行。
您需要提供自己的ElementQualifier
实现。RecursiveElementNameAndTextQualifier
可能会将一个文档中的相同元素与另一个文档中的多个元素进行匹配。
对于我来说,我还需要在DiffBuilder
上添加checkForSimilar()
方法。
如果没有它,断言错误,表示节点的序列不相同(子列表中的位置不相同)
我的代码是:Diff diff = DiffBuilder
.compare(myExpectedResultXmlObj)
.withTest(myCompareToXmlObj)
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
.build();