Сравнение XML с использованием XMLunit не работает при переупорядочении элементов

У меня есть два 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>

Порядок последних двух <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 с селектором элемента должно игнорировать порядок. Спасибо

1 ответ

С помощью byNameAndText вы убедитесь, что вы выбрали правильный author теги, но это слишком поздно, так как XMLUnit должен выбрать правильный book для вашего сравнения, чтобы преуспеть. Как только он решил, на котором book Элемент для сравнения никогда не будет искать элементы в другом поддереве.

Я не думаю author это то, что отличает книги в конце концов, но при отсутствии каких-либо других намеков что-то вроде

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

должно вероятно работать.

Другие вопросы по тегам