Сравнение XML, игнорирующего порядок элементов

С XMLUnit 2 как вы сравниваете два документа без учета порядка элементов?

Я получил этот вопрос для XMLUnit 1, но, видимо, новый API в v2 больше не имеет указанного метода.

Это мой текущий код:

Diff diff = DiffBuilder.compare(expected)
            .withTest(actual)
            .ignoreComments()
            .ignoreWhitespace()
            .checkForSimilar()
            .build();

assertFalse(diff.hasDifferences());

Отредактируйте комментарий Stefan Bodewigs:

Это две строки, которые я сравниваю с приведенным выше фрагментом:

String expected = "<root><foo>FOO</foo><bar>BAR</bar></root>";
String actual = "<root><bar>BAR</bar><foo>FOO</foo></root>";

Сообщается о различиях

Expected element tag name 'foo' but was 'bar' - comparing <foo...> at /root[1]/foo[1] to <bar...> at /root[1]/bar[1] (DIFFERENT)
Expected text value 'FOO' but was 'BAR' - comparing <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] to <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] (DIFFERENT)
Expected element tag name 'bar' but was 'foo' - comparing <bar...> at /root[1]/bar[1] to <foo...> at /root[1]/foo[1] (DIFFERENT)
Expected text value 'BAR' but was 'FOO' - comparing <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] to <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] (DIFFERENT)

Ответ 1

Одна разница, которая может потребоваться стать более понятной в документации 2.x, - это по умолчанию ElementSelector - примерно то, что раньше было ElementQualifier в 1.x. Где 1.x по умолчанию соответствуют элементам по имени, 2.x по умолчанию соответствуют элементам по порядку. Может быть, это плохая идея.

Ваш Diff должен работать, если вы переключаетесь на сопоставление имен элементов.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))