36

次のような 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 以外のライブラリを使用する提案を歓迎します。

4

5 に答える 5

39

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

    }
}
于 2009-08-06T23:29:09.910 に答える
26

この質問に回答して以来、 XMLUnitの状況は大きく変わりました。

を使用すると、ノードを簡単に無視できるようになりましたDiffBuilder

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

その後、フィルターに追加されたノードを呼び出すdocumentDiff.hasDifferences()と、無視されます。

于 2016-05-25T15:56:03.540 に答える
9

XSLT と恒等変換を使用して、無視する要素を除外し、結果を比較します。

XSL: how to copy a tree, but remove some nodes を参照してください。SOの早い段階で。

于 2009-08-06T23:18:45.783 に答える
0

無視するノードの数に関係なくノードを無視するか、無視するノードの数がわからない場合は、次の簡単な手順に従ってください。

これは、2 つの xml を文字列として使用する単なる XMLdiff メソッドです。

public static void XMLdiff(String XML1, String XML2){
               
 //nodes you wanted to ignore
        String[] ignoreNodes = {"nodeX", "nodeY", "nodeZ"};
      
//testnode(node,ignoreNodes) is handled below for finding and ignoring multiple nodes
        final Diff documentDiff = DiffBuilder.compare(XML1)
                                  .withTest(XML2)
                                  .withNodeFilter(node->testnode(node,ignoreNodes))
                                  .build();
}

private static boolean testnode(Node node, String[] name) {

        for (int i = 0; i < name.length; i++) {

            if (node.getNodeName().toString().equals(name[i])) {
                return false;
            }
            if (name.length == 0) {
                break;
            }
        }
        return true;
    }

このリンクから依存関係または jar を追加します https://www.xmlunit.org/

于 2021-06-23T12:01:13.213 に答える