Сравните два xml, используя XMLUnit, минуя порядок элементов

Я пишу утилиту сравнения, которая позволяет мне сравнивать сходство двух XML-файлов без учета порядка. Я использую xmlunit 2.4.0

org.xmlunit.diff.Diff diff = DiffBuilder.compare(xml1)
                .withTest(xml2)
                .checkForSimilar()
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
                .build();

Таким образом, следующие два XML-файла успешно сравниваются.

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();

person paulophoenix    schedule 11.01.2018    source источник


Ответы (1)


Ваш XPath ничего не соответствует.

Контекст "." это узел, который вы выбрали с помощью whenElementIsNamed, так что это соответствующий элемент «цветы».

Вы, вероятно, имеете в виду "./flower" - и он не находит различий в вашем примере.

person Stefan Bodewig    schedule 12.01.2018
comment
Да, это исправило мой второй пример, но теперь он ломается для моего первого. - person paulophoenix; 12.01.2018
comment
Ваша первоначальная попытка первого примера сработала только случайно. Нет встроенного ElementSelector, который будет работать для обоих ваших примеров, так как для того, чтобы выяснить, какие цветы выбрать, вам сначала нужно установить, совпадают ли вложенные элементы цветов. Вероятно, вам нужно написать более конкретный сопоставитель самостоятельно. - person Stefan Bodewig; 14.01.2018
comment
@ Стефан Бодевиг. Возможно ли с xmlUnit иметь подход, который может работать для первого примера? даже с настроенным сопоставлением узлов. Если да, можете ли вы предоставить некоторые указатели/руководство, с помощью которых это может быть достигнуто. - person hiren; 30.08.2019
comment
Вы запрашиваете единую конфигурацию, которая будет работать для первой пары XML-файлов (с двумя элементами flower в каждом), а также для второй пары (только с одним flower в каждом, но переставленным flowers)? Я уверен, что это не совсем та проблема, с которой вы столкнулись, а немного другая, и любой конкретный пример вам не подойдет. - person Stefan Bodewig; 30.08.2019
comment
Общий ход мыслей таков: представьте, что у вас есть список Element, соответствующих вашим flowers узлам. Откуда вы знаете, какие из них соответствуют. Переведите это как на Java с помощью DOM и оберните его в файл ElementSelector. Более конкретный ответ не помещается здесь в комментарий :-) - person Stefan Bodewig; 30.08.2019