1

2 つの XML があります

<books><book language="English"><authors><author>Niklaus Wirth</author></authors></book><book language="English"><authors><author>Mark Twain</author></authors></book><book language="English"><authors><author>O.-J. Dahl</author></authors></book></books>


<books><book language="English"><authors><author>Niklaus Wirth</author></authors></book><book language="English"><authors><author>O.-J. Dahl</author></authors></book><book language="English"><authors><author>Mark Twain</author></authors></book></books>

最後の 2 つの<author>タグの順序は異なりますが、似ているはずです。これがコードです

public static void compare() throws FileNotFoundException{
        String sourceXML=convertXMLtoString(source);
        String targetXML=convertXMLtoString(target);
        System.out.println(sourceXML);
        System.out.println(targetXML);
        Diff mydiff=DiffBuilder.compare(sourceXML)
        .withTest(targetXML)
        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
        .checkForSimilar()
        //.withNodeMatcher()
        .build();
        Iterable<Difference> differences = mydiff.getDifferences();
        for(Difference d:differences){
            System.out.println(d.toString());
        }
    }

これが出力です。

Expected child 'author' but was 'null' - comparing <author...> at /books[1]/book[2]/authors[1]/author[1] to <NULL> (DIFFERENT)
Expected child 'null' but was 'author' - comparing <NULL> to <author...> at /books[1]/book[2]/authors[1]/author[1] (DIFFERENT)
Expected child 'author' but was 'null' - comparing <author...> at /books[1]/book[3]/authors[1]/author[1] to <NULL> (DIFFERENT)
Expected child 'null' but was 'author' - comparing <NULL> to <author...> at /books[1]/book[3]/authors[1]/author[1] (DIFFERENT)

これを無視する方法を誰か教えてもらえますか? NameandText を要素セレクターで使用すると、順序を無視する必要があると思いました。ありがとう

4

1 に答える 1

1

を使用して正しいタグを選択していることを確認しますが、比較を成功させるには XMLUnit がbyNameAndText正しいauthorタグを選択する必要があるため、これでは遅すぎます。book比較するbook要素が決まれば、別のサブツリーで要素を検索することはありません。

最終的に本を区別するものだとは思いませんauthorが、他に次のようなヒントがない場合

ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("book").thenUse(ElementSelectors.byXPath("./authors/author", ElementSelectors.byNameAndText))
    .elseUse(ElementSelectors.byNameAndText)
    .build();

おそらく動作するはずです。

于 2016-08-27T13:58:43.953 に答える