2009-08-06 6 views
27

私はそうのようなXMLメッセージがあります。XMLを比較するときに特定の要素を無視するにはどうすればよいですか?

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

を私は期待メッセージにテスト対象の方法により製造されたこのタイプのメッセージを比較したいが、私は約elementAを気にしません。だから、私は上記のメッセージがに等しいと考えることがしたい:私はXMLUnitの最新バージョンを使用してい

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

私は答えがカスタム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

+0

この解決法はかなり古いものです。明らかに、新しいxmlunitプログラミングモデルは、DifferenceListenerではなく、[ComparisonListener](http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html)を使用しています。 – Cheeso

-1

public class IgnoreNamedElementsDifferenceListenerはDifferenceListenerを実装します。プライベートセット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

関連する問題