在比较两个.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()))
但是每次都会失败。我不知道问题出在名称空间,还是元素为空。
将寻求任何帮助。预先谢谢你。
答案 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
。