Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XMLUnit比较动态变化的XML_Java_Xml_Xmlunit - Fatal编程技术网

Java 使用XMLUnit比较动态变化的XML

Java 使用XMLUnit比较动态变化的XML,java,xml,xmlunit,Java,Xml,Xmlunit,目前我正在使用XMLunit进行测试。我有两个XML,如下所示。 XML1 卡迪希 对 阿努 对 安妮 不 艾舒 不 XML2 安妮 对 艾舒 对 卡迪希 不 阿努 不 问题1: 如上例所示,节点“nameValuePair”每次都会动态更改。XMLUnit将此视为差异 第2期: 即使节点“名称”更改,“值”为是或否,XMLUnit也不会将其标识为差异。 请给我一种比较XML类型的方法。 从您的描述中,我理解您认为那些“代码> NavaPrimePosis< /Case>元素与具有相同嵌

目前我正在使用XMLunit进行测试。我有两个XML,如下所示。 XML1


卡迪希
对
阿努
对
安妮
不
艾舒
不
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();