XMLUnit - 添加了标签?

时间:2017-03-19 18:29:29

标签: java xml xmlunit

将以下两个文档与XMLUnit(最新版本 - 2.3.0)进行比较时 在本文档中,元素的顺序是无关紧要的,但是XMLUnit正在考虑这一点,并且由于新元素被附加到父标记的开头,所以当只有一个发生时,它会检测到多个更改。

原始XML(上一个):

<ACVS>
    <ACV>
        <N>735</N>
        <C>S135</C>
    </ACV>
    <ACV>
        <N>736</N>
        <C>C0S135</C>
    </ACV>
    <ACV>
        <N>7Q4</N>
        <C>C0S135</C>
    </ACV>
</ACVS>

新XML(当前):

<ACVS>
    <ACV>
        <N>701</N>
        <C>C10S120</C>
    </ACV>
    <ACV>
        <N>735</N>
        <C>S135</C>
    </ACV>
    <ACV>
        <N>736</N>
        <C>C0S135</C>
    </ACV>
    <ACV>
        <N>7Q4</N>
        <C>C0S135</C>
    </ACV>
</ACVS>

比较

Diff fileChanges = DiffBuilder.compare(Input.fromFile(previous))
            .withTest(Input.fromFile(current))
            .ignoreWhitespace()
            .checkForSimilar()
            .build();

fileChanges.getDifferences()

由于元素匹配不正确,我最终会进行一些更改:

  • ACV [1] - N [1]:预期&#39; 735&#39;但是&#39; 701&#39;
  • ACV [1] - C [1]:预期&#39; S135&#39;但是&#39; C10S120&#39;
  • ACV [2] - N [1]:预期&#39; 736&#39;但是&#39; 735&#39;
  • 等......然后:
  • ACV [4]:添加了新标记

当我希望进行一次改变时:

  • ACV [1]:新标记已添加

有什么办法可以使用XMLUnit实现这个结果吗?

1 个答案:

答案 0 :(得分:0)

您希望通过指定标识对的ACV来帮助XMLUnit了解哪些ElementSelector属于一起。但即便如此,除了&#34;添加新标签之外,你最终还会有两个Difference s&#34; ACVS的孩子数量会有所不同。

通过查看您的示例,您似乎会考虑由ACV孩子的文字内容确定的N。这是您需要告诉XMLUnit的内容。这种情况与https://github.com/xmlunit/user-guide/wiki/SelectingNodes中的tr示例非常相似(将tr替换为ACV,将th替换为N。您应该能够通过

获得预期的结果
ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("ACV").thenUse(ElementSelectors.byXPath("./N", ElementSelectors.byNameAndText))
    .elseUse(ElementSelectors.byName)
    .build();

或其变体。