2015-11-13 2 views
6

Avec XMLUnit 2, comment comparer deux documents sans tenir compte de l'ordre des éléments?Comparer l'ordre des éléments ignorant XML

J'ai obtenu this question for XMLUnit 1, mais apparemment la nouvelle API dans v2 ne possède plus la méthode mentionnée.

Ceci est mon code actuel:

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

assertFalse(diff.hasDifferences()); 

Modifier Stefan Bodewigs commentaire:

Ce sont les deux chaînes je compare avec extrait ci-dessus:

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

Les diffs rapportés

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

La nouvelle API doit ignorer l'ordre des éléments par défaut (ce qui est ce 'DifferenceEvaluators.DEFAULT' fait). Êtes-vous sûr que c'est la différence que vous voyez et rien d'autre? –

+0

J'ai répliqué le problème d'OP, même quand j'ai ajouté .checkForSimilar(). Cela semble contraire à la documentation sur https://github.com/xmlunit/user-guide/wiki/DifferenceEvaluator#default-differenceevaluator L'ajout de .withNodeMatcher() décrit ci-dessous a résolu le problème. –

Répondre

8

Une différence qui peut avoir besoin de devenir plus claire dans la documentation 2.x est la valeur par défaut ElementSelector - à peu près ce qui était ElementQualifier en 1.x. Où 1.x par défaut pour faire correspondre les éléments par nom, 2.x par défaut pour faire correspondre les éléments dans l'ordre. Peut-être que c'est une mauvaise idée.

Votre Diff devrait fonctionner si vous passez à la correspondance sur les noms d'éléments.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

+0

Merci, Stefan! –