使用 XMLUnit 比较动态变化的 XML

Compare a dynamically changing XML using XMLUnit

目前我正在使用XML单元进行测试。我有两个 XML 如下。 XML1

<envelope>
<NameValuePairs>
<Name>Karthick</Name>
<value>yes</value>
</NameValuePairs>
<NameValuePairs>
<Name>Anu</Name>
<value>yes</value>
</NameValuePairs>
<NameValuePairs>
<Name>Annie</Name>
<value>No</value>
</NameValuePairs>
<NameValuePairs>
<Name>Aishu</Name>
<value>No</value>
</NameValuePairs>
</envelope>

XML2

<envelope>
    <NameValuePairs>
        <Name>Annie</Name>
        <value>yes</value>
    </NameValuePairs>
    <NameValuePairs>
        <Name>Aishu</Name>
        <value>yes</value>
    </NameValuePairs>
    <NameValuePairs>
        <Name>Karthick</Name>
        <value>No</value>
    </NameValuePairs>
    <NameValuePairs>
        <Name>Anu</Name>
        <value>No</value>
    </NameValuePairs>
</envelope>

问题 1: 如上例所示,节点 "nameValuePair" 每次都动态变化。 XML单位认为这是差异。
问题 2:
即使节点 "name" 发生变化并且 "value" 是或否,XMLUnit 不会将其识别为差异。

请建议我一种比较这些类型的方法 XML。

根据您的描述,我了解到您认为那些 NameValuePairs 元素与具有相同嵌套文本的 Name 子元素相同。并且您希望 XMLUnit 忽略 NameValuePairs 实例的顺序,只要它根据上述定义选择 "correct" 对。这是正确的吗?

如果是这样,你需要告诉 XMLUnit 哪些 NameValuePairs 是要相互比较的,这是 ElementSelector 的工作(假设这里的 XMLUnit 2.x) .您的示例确实与 XMLUnit's User Guide 中的 tr 示例相同,我鼓励您去那里了解完整的详细信息。

每当 XMLUnit 遇到一组同级元素时,就会参考 ElementSelector 来决定将哪些分支相互比较。一旦选择了分支,就没有回头路了。 IE。当 XMLUnit 决定按文档顺序比较 NameValuePairs 元素时,它永远不会查看与当前所在分支不同的分支中的 Name 元素。这意味着您需要告诉 XMLUnit 选择哪个分支根据需要在文档层次结构中尽可能高。

在您的情况下,您确实有一个 envelope,因此 ElementSelector 并不重要,只要它愿意比较那里唯一的元素即可。 NameValuePairs 的子项都有不同的元素名称,因此 ElementSelectors.byName 将适用于它们 - 以及 envelope.

将我的第一句话 "you consider those NameValuePairs elements the same that have a Name child element with the same nested text" 翻译成 XMLUnit 的内置 ElementSelectors 我最终得到 ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText)byNameAndText 中的 byName 部分是有点多余,因为 XPath 已经确保名称相同)。把这些放在一起你需要使用 ElementSelector of

ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("NameValuePair").thenUse(ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText))
    .elseUse(ElementSelectors.byName)
    .build();

使用那个 XMLUnit 应该匹配 NameValuePairs,即使它们没有按顺序排列,并检测 "matching pairs" 的 Value 元素是否有变化的嵌套文本。