使用 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 的内置 ElementSelector
s 我最终得到 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
元素是否有变化的嵌套文本。
目前我正在使用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 的内置 ElementSelector
s 我最终得到 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
元素是否有变化的嵌套文本。