在比较 XML 时,如何忽略某些元素?

2022-09-01 04:18:24

我有一个XML消息,如下所示:

<root>
  <elementA>something</elementA>
  <elementB>something else</elementB>
  <elementC>yet another thing</elementC>
</root>

我想将受测方法生成的此类型的消息与预期的消息进行比较,但我不关心。因此,我希望上述消息被视为等于:elementA

<root>
  <elementA>something different</elementA>
  <elementB>something else</elementB>
  <elementC>yet another thing</elementC>
</root>

我使用的是最新版本的 XMLUnit

我想象答案涉及创建自定义 ;我只是不想重新发明轮子,如果有东西可以在那里使用。DifferenceListener

欢迎使用 XMLUnit 以外的库的建议。


答案 1

我最终实现了一个,它采用节点名称(带有命名空间)的列表来忽略以下各项的文本差异:DifferenceListener

public class IgnoreNamedElementsDifferenceListener implements DifferenceListener {
    private Set<String> blackList = new HashSet<String>();

    public IgnoreNamedElementsDifferenceListener(String ... elementNames) {
        for (String name : elementNames) {
            blackList.add(name);
        }
    }

    public int differenceFound(Difference difference) {
        if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) {
            if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) {
                return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
        }

        return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
    }

    public void skippedComparison(Node node, Node node1) {

    }
}

答案 2

自从这个问题得到解答以来,XMLUnit 的情况已经发生了很大变化。

现在,在使用时,您可以轻松忽略节点:DiffBuilder

final Diff documentDiff = DiffBuilder
            .compare(expectedSource)
            .withTest(actualSource)
            .withNodeFilter(node -> !node.getNodeName().equals(someName))
            .build();

如果随后调用添加到筛选器的节点将被忽略。documentDiff.hasDifferences()


推荐