XMLUnit比较Xml比较错误的节点

当父节点的顺序不同时,我遇到了问题.

例如:

示例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元素与其交换的订单进行比较.听起来好像你想通过查看嵌套在其中的名字子元素的文本内容来识别匹配对.就这篇文章而言,没有别的.

这不是RecursiveElementNameAndTextQualifier所做的.它比较了所有子元素的元素名称和嵌套文本.并且由于某些字段元素的顺序是交换的,因此您要比较的节点不符合条件.

您会看到XMLUnit按顺序选择level1元素,因为当完全没有找到匹配的节点对时,它会回退到这样做.如果将compareUnmatched设置为false,则会得到CHILD_NODE_NOT_FOUND差异.

在XMLUnit 1.x(2.x尚未发布)中,您将不得不编写一个嵌入您自己需要的逻辑的ElementQualifier,没有内置的ElementQualifier完全符合您的要求.

点赞