XMLUnit - 添加标签?

XMLUnit - Added Tags?

将以下两个文档与XML单元进行比较时(最新版本-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()

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

当我希望一次改变时:

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

您想帮助 XMLUnit 了解哪些 ACV 属于一起,方法是指定一个 ElementSelector 来标识这些对。但即便如此,你最终还是会得到两个 Difference,除了 "new tag added" 之外,还会有一个“ACVS 的 children 的数量不同。

通过查看您的示例,您似乎认为您的 ACV 是由 N child 的文本内容标识的。这就是您需要告诉 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();

或其变体。