Сравните два XML с использованием XMLUnit, минуя порядок элементов
Я пишу утилиту сравнения, которая позволяет мне сравнивать сходство двух xmls без учета порядка. Использую xmlunit 2.4.0
org.xmlunit.diff.Diff diff = DiffBuilder.compare(xml1)
.withTest(xml2)
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
.build();
Таким образом, ниже два xmls сравниваются успешно
xml1:
<multistatus>
<flowers>
<flower>Roses</flower>
<flower>Daisy</flower>
</flowers>
<flowers>
<flower>Roses</flower>
<flower>Daisy</flower>
</flowers>
</multistatus>
xml2:
<multistatus>
<flowers>
<flower>Roses</flower>
<flower>Daisy</flower>
</flowers>
<flowers>
<flower>Daisy</flower>
<flower>Roses</flower>
</flowers>
</multistatus>
Однако это не удается, когда я даю следующие данные: xml1:
<multistatus>
<flowers>
<flower>Roses</flower>
</flowers>
<flowers>
<flower>Daisy</flower>
</flowers>
</multistatus>
xml2:
<multistatus>
<flowers>
<flower>Daisy</flower>
</flowers>
<flowers>
<flower>Roses</flower>
</flowers>
</multistatus>
Я пытался создать ElementSelector, и даже это не помогает.
ElementSelector selector = ElementSelectors.conditionalBuilder()
.whenElementIsNamed("flowers").thenUse(ElementSelectors.byXPath("./flowers/flower", ElementSelectors.byNameAndText))
.elseUse(ElementSelectors.byName)
.build();
org.xmlunit.diff.Diff diff = DiffBuilder.compare(refSource)
.withTest(testSource)
.checkForSimilar()
.ignoreWhitespace()
.normalizeWhitespace()
.withNodeMatcher(
new DefaultNodeMatcher(
selector,ElementSelectors.Default)
)
.build();
1 ответ
Решение
Ваш XPath ничего не соответствует.
Контекст "." это узел, который вы выбрали с whenElementIsNamed
так что это соответствующий элемент "цветы".
Вы, вероятно, имеете в виду "./flower" - и в вашем примере он не находит различий.