XMLUNIT 2在diffbuilder和名称空间中使用带有忽略元素顺序的比较失败

时间:2019-12-13 14:05:29

标签: xmlunit

在比较两个.xml文件时,我尝试使用DiffBuilder忽略XML元素顺序,但是失败。在发布此问题之前,我已经尝试了所有可能的组合并阅读了许多文章。

例如:

<Data:Keys>
 <Data:Value Key="1" Name="Example1" />
 <Data:Value Key="2" Name="Example2" />
 <Data:Value Key="3" Name="Example3" />
</Data:Keys>

<Data:Keys>
 <Data:Value Key="2" Name="Example2" />
 <Data:Value Key="1" Name="Example1" />
 <Data:Value Key="3" Name="Example3" />
</Data:Keys>

我希望将这两个视为相同的XML。注意元素是空的,它们只有属性。 我到目前为止所做的:

def diff = DiffBuilder.compare(Input.fromString(xmlIN))
           .withTest(Input.fromString(xmlOUT))
           .ignoreComments()
           .ignoreWhitespace()
           .checkForSimilar()
           .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
           .whenElementIsNamed("Data:Keys").thenUse(ElementSelectors.byXPath("./Data:Value", 
            ElementSelectors.byNameAndText))
           .elseUse(ElementSelectors.byName)
           .build()))

但是每次都会失败。我不知道问题出在名称空间,还是元素为空。

将寻求任何帮助。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

如果您希望通过标签Data:Value的属性将它们匹配在一起,则应从此开始:

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
           .whenElementIsNamed("Data:Value") 

,并且由于该标签没有任何文本,因此byNameAndText将不起作用。您只能使用名称和属性。我的建议是这样做:

.thenUse(ElementSelectors.byNameAndAttributes("Key"))

.thenUse(ElementSelectors.byNameAndAllAttributes()) 
//equivalent
.thenUse(ElementSelectors.byNameAndAttributes("Key", "Name"))

关于名称空间的问题,checkForSimilar()应该输出SIMILAR,这意味着它们不是DIFFERENT,所以这就是您所需要的。如果您不使用checkForSimilar(),则名称空间的差异将输出为DIFFERENT

相关问题