2015-11-13 8 views
6

Mit XMLUnit 2 wie vergleicht man zwei Dokumente, ohne die Reihenfolge der Elemente zu berücksichtigen?XML-Ignorierelement-Reihenfolge vergleichen

Ich habe this question for XMLUnit 1, aber anscheinend hat die neue API in v2 die erwähnte Methode nicht mehr.

Dies ist mein aktueller Code:

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

assertFalse(diff.hasDifferences()); 

bearbeiten zu Stefan Bodewigs Kommentar:

Dies sind die beiden Strings i mit über Schnipsel vergleichen:

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

Die berichteten 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) 
+0

Das neue API sollte Element, um standardmäßig (das ist, was 'DifferenceEvaluators.DEFAULT' der Fall ist) ignorieren. Sind Sie sicher, dass dies der Unterschied ist, den Sie sehen, und nichts anderes? –

+0

Ich replizierte OP-Problem, auch wenn ich .checkForSimilar() hinzugefügt. Dies scheint der Dokumentation unter https://github.com/xmlunit/user-guide/wiki/DifferenceEvaluator#default-differenceevaluator zu widersprechen. Das Hinzufügen des unten beschriebenen .withNodeMatcher() löste das Problem. –

Antwort

8

Ein Unterschied, der in der Dokumentation von 2.x deutlicher werden muss, ist der Standardwert ElementSelector - ungefähr das, was in 1.x ElementQualifier war. Wenn 1.x standardmäßig Elemente nach Namen abgleicht, stimmt 2.x standardmäßig mit den Elementen überein. Vielleicht ist das eine schlechte Idee.

Ihr Diff sollte funktionieren, wenn Sie bei Elementnamen zum Abgleich wechseln.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

+0

Danke, Stefan! –