2009-08-06 43 views
27

我有一个XML消息,像这样:如何在比较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以外的库的建议。

回答

10

事情已经改变了很多关于XMLUnit因为该问题得到回答。

使用DiffBuilder时,您现在可以轻松地忽视了一个节点:

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

如果你再调用documentDiff.hasDifferences()节点添加到过滤器将被忽略。

38

我结束了实施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) { 

    } 
} 
+13

我很惊讶这是一个复杂的问题 - 如果xmlunit没有内建某些内容来忽略特定元素,那会令人失望吗? – bacar 2012-01-31 17:14:29

+0

现在这个解决方案已经很老了。显然,新的xmlunit编程模型使用[ComparisonListener](http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html),而不是DifferenceListener。 – Cheeso 2017-07-25 02:19:37

-1

public class IgnoreNamedElementsDifferenceListener implements DifferenceListener private Set blackList = new 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) { 

} 

}

如何调用该自己实现我的方法,看忽略了比较具体的节点之后的差异?

+0

好像你在问一个新问题作为答案。如果您有新问题,请将其作为问题,而不是对现有问题的回答。 – Cheeso 2017-07-25 02:18:46

相关问题