Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare XML ignoring element order

With XMLUnit 2 how do you compare two documents without taking the element order into account?

I got this question for XMLUnit 1, but apparently the new API in v2 doesn't have the mentioned method anymore.

This is my current code:

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

assertFalse(diff.hasDifferences());

Edit to Stefan Bodewigs comment:

These are the two strings i compare with above snippet:

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

The reported diffs

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)
like image 584
Imperative Avatar asked Nov 13 '15 14:11

Imperative


People also ask

What is XMLUnit?

XMLUnit provides you with the tools to verify the XML you emit is the one you want to create. It provides helpers to validate against an XML Schema, assert the values of XPath queries or compare XML documents against expected outcomes.

How do I compare two XML files in Visual Studio?

locate the required file in the Solution Explorer window, right-click it and choose Compare Selected File in the context menu; open the required file in Visual Studio, right-click the required document name in the document tab well and in the document's context menu select Compare Current File.


1 Answers

One difference that may need to become clearer in the 2.x documentation is the default ElementSelector - roughly what used to be ElementQualifier in 1.x. Where 1.x defaults to match elements by name, 2.x defaults to match elements in order. Maybe this is a bad idea.

Your Diff should work if you switch to matching on element names.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

like image 74
Stefan Bodewig Avatar answered Sep 20 '22 04:09

Stefan Bodewig