Java 使用XMLUnit比较动态变化的XML
目前我正在使用XMLunit进行测试。我有两个XML,如下所示。 XML1Java 使用XMLUnit比较动态变化的XML,java,xml,xmlunit,Java,Xml,Xmlunit,目前我正在使用XMLunit进行测试。我有两个XML,如下所示。 XML1 卡迪希 对 阿努 对 安妮 不 艾舒 不 XML2 安妮 对 艾舒 对 卡迪希 不 阿努 不 问题1: 如上例所示,节点“nameValuePair”每次都会动态更改。XMLUnit将此视为差异 第2期: 即使节点“名称”更改,“值”为是或否,XMLUnit也不会将其标识为差异。 请给我一种比较XML类型的方法。 从您的描述中,我理解您认为那些“代码> NavaPrimePosis< /Case>元素与具有相同嵌
卡迪希
对
阿努
对
安妮
不
艾舒
不
XML2
安妮
对
艾舒
对
卡迪希
不
阿努
不
问题1:
如上例所示,节点“nameValuePair”每次都会动态更改。XMLUnit将此视为差异第2期:
即使节点“名称”更改,“值”为是或否,XMLUnit也不会将其标识为差异。
请给我一种比较XML类型的方法。
从您的描述中,我理解您认为那些“代码> NavaPrimePosis< /Case>元素与具有相同嵌套文本的<代码>名称< /代码>子元素相同。您希望XMLUnit忽略NameValuePairs
实例的顺序,只要它根据上述定义选择了“正确”的对。这是正确的吗
如果是这样,您需要告诉XMLUnit哪些NameValuePairs
s是要相互比较的,这是ElementSelector
的工作(这里假设XMLUnit 2.x)。您的示例实际上与中的tr
示例相同,我鼓励您到那里了解完整的细节
每当XMLUnit遇到一组同级元素时,都会参考ElementSelector
,以确定要相互比较的分支。一旦选择了分支,就没有回头路了。也就是说,当XMLUnit决定按文档顺序比较NameValuePairs
元素时,它永远不会在与其当前所在分支不同的分支中查看Name
元素。这意味着您需要根据需要告诉XMLUnit在文档层次结构中选择哪个分支
在您的情况下,您确实有一个信封
,因此元素选择器
实际上并不重要,只要它愿意比较仅有的元素。NameValuePairs
的子元素都有不同的元素名称,因此ElementSelector.byName
将适用于它们,也适用于envelope
翻译我的第一句话:“你认为那些代码> NAMPAREPATEOS/<代码>元素有相同的<代码>名称< /代码>具有相同嵌套文本的子元素“进入XMLUnit的内置代码>元素选择符 s,我最后用<代码>元素选择器.ByXPATH(“./NoD”,En元器件选择器.ByMaNand文本)(其中,byNameAndText
中的byName
部分有点多余,因为XPath已经确保了名称是相同的)
ElementSelectors.conditionalBuilder()
.whenElementIsNamed("NameValuePair").thenUse(ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText))
.elseUse(ElementSelectors.byName)
.build();
使用该XMLUnit,即使不符合顺序,也应该匹配
NameValuePairs
,并检测“匹配对”的Value
元素是否有变化的嵌套文本。非常感谢您提供的HeadUp,我能够使用WhenElementIsnaed(“NameValuePairs”)。然后使用(新的ByName和TextRecSelector()
insead使用xpath
<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>
ElementSelectors.conditionalBuilder()
.whenElementIsNamed("NameValuePair").thenUse(ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText))
.elseUse(ElementSelectors.byName)
.build();