比较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) { }
}
如何调用这个自己的实现到我的方法,以查看比较忽略特定节点后的差异。