Сравнение 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();
должно вероятно работать.