2009-08-06 41 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

相關問題