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

我有这样的XML消息:

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

我想比较一个由testing方法产生的这种types的消息到一个预期的消息,但我不关心elementA 。 所以,我想上面的消息被认为是等于:

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

我正在使用最新版本的XMLUnit 。

我想象的答案涉及到创build一个自定义的DifferenceListener ; 如果有什么东西可以使用的话,我只是不想重新发明轮子。

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

由于这个问题已经得到解答, XMLUnit的事情已经发生了很大变化。

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

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

如果您然后调用documentDiff.hasDifferences()节点添加到filter将被忽略。

我最终实现了一个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) { } } 

我将使用XSLT和身份转换过滤掉我想忽略的元素,并比较结果。

请参阅XSL:如何复制树,但删除一些节点? 早些时候在SO上。

公共类IgnoreNamedElementsDifferenceListener实现DifferenceListener {私人设置blackList =新的HashSet();

 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) { } 

}

如何调用这个自己的实现到我的方法,以查看比较忽略特定节点后的差异。