2017-05-19 8 views
0

J'utilise XMLUnit2 pour comparer 2 XML qui n'ont pas d'éléments dans le même ordre. Je vois l'erreur ci-dessous -XMLUnit - Problème par rapport aux XML qui ne sont pas dans le même ordre

Différences = enfant attendu 'BILLINGCODE', mais était 'nul' - comparer à /translateServiceRequestResponse [1]/translateServiceRequestReturn [1]/legacyCode [2]/BILLINGCODE [1] NULL

code

Diff myDiff = DiffBuilder.compare(controlResponse).ignoreWhitespace().ignoreComments().withTest(testResponse).withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText)).checkForSimilar().build(); 
System.out.println("Differences = " + myDiff.toString()); 

fichier de contrôle

<translateServiceRequestResponse> 
<translateServiceRequestReturn> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VS128</billingCode> 
     <description>HD Rec</description> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>0</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VF123</billingCode> 
     <description>HD Rec</description> 
     <packageCode>VE286</packageCode> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>0</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VF170</billingCode> 
     <description>HD Rec</description> 
     <packageCode>VE286</packageCode> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>2.5</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
</translateServiceRequestReturn> 

test fichier

<translateServiceRequestResponse> 
<translateServiceRequestReturn> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VS128</billingCode> 
     <description>HD Rec</description> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>0</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VF170</billingCode> 
     <description>HD Rec</description> 
     <packageCode>VE286</packageCode> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>2.5</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
    <legacyCode> 
     <amount>0</amount> 
     <billingCode>VF123</billingCode> 
     <description>HD Rec</description> 
     <packageCode>VE286</packageCode> 
     <priceName>EquipChoice X1 HD TP</priceName> 
     <pricingElementName>X1 HD Receiver</pricingElementName> 
     <codeAmount>0</codeAmount> 
     <lobSubType>0</lobSubType> 
     <addressable>1</addressable> 
     <nonStandard>false</nonStandard> 
    </legacyCode> 
</translateServiceRequestReturn> 

Répondre

2

xmlunit utilise le ElementSelector afin de déterminer quels sont les éléments de deux ensembles de frères et sœurs dans les documents de contrôle et de test pour correspondre avec L'un et l'autre. Il va commencer à correspondre à la racine des documents et vous devez vous assurer qu'il choisit les bonnes branches à chaque niveau. Une fois qu'une décision a été prise, XMLUnit ne retournera pas en arrière.

Lors de la sélection d'un ElementSelector, vous devez toujours veiller à ce qu'il aide XMLUnit à prendre la bonne branche aussi près de la racine du document que la structure logique de votre document l'exige. Les éléments que vous dites ne sont pas dans le même ordre sont les éléments legacyCode, vous devez donc aider XMLUnit à faire la bonne sélection parmi eux. byNameAndText ne va pas aider ici. Il n'y a aucun texte imbriqué dans byNameAndText, donc ils sont tous identiques et XMLUnit correspond aux éléments dans l'ordre du document.

Ceci est exactement le même problème que celui sur tr s dans https://github.com/xmlunit/user-guide/wiki/SelectingNodes

Pour me semble que si votre legacyCode serait identifié par le texte imbriqué dans l'élément billingCode. Si oui, vous pouvez utiliser un ElementSelector comme

ElementSelectors.conditionalBuilder() 
    .whenElementIsNamed("legacyCode").thenUse(ElementSelectors.byXPath("./billingCode", ElementSelectors.byNameAndText)) 
    .elseUse(ElementSelectors.byName) 
    .build(); 

Vous devrez peut-être adapter cette sorte qu'il fonctionne pour certaines parties du du document que vous avez non représentés ou si byNameAndText est vraiment nécessaire plutôt que byName pour d'autres parties de l'arbre.

+0

Merci Stephan. J'ai un certain nombre d'éléments similaires à legacyCode répertoriés ici. Devrais-je spécifier chacun d'entre eux par son nom ou existe-t-il un moyen générique de le formuler? Apprécier ton aide! –

+0

À côté de 'whenElementIsNamed', il y a aussi' when' qui accepte un 'Predicate '. S'il y a une règle que vous pouvez spécifier et qui sélectionne tous vos éléments, vous pouvez l'utiliser. –

+0

Merci encore, Stephan. Est-il possible de donner un exemple? –