J'ai donc l'entrée suivante, la sortie attendue et XML de sortie réelle:xmlunit: Erreur avec ElementSelectors.conditionalBuilder
input.xml
<Request>
<EmailSubjectLine>Main Contact & No Reported To</EmailSubjectLine>
<ProductRq>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
</ProductRq>
<!-- rest of input -->
</Request>
attendu-output.xml
<ProductRq xmlns="http://test.org/standards/intake">
<Audit>
<TransID>Test</TransID>
</Audit>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<RqUID>Test</RqUID>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
<!-- rest of expected-output -->
</ProductRq>
actuelle-sortie.xml
<ProductRq xmlns="http://test.org/standards/intake">
<Audit>
<TransID>123534Abwe-asdcv-1258qw-asd</TransID>
</Audit>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<RqUID>CG-17Dawe-12354-Hw35Sf</RqUID>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
<!-- rest of actual-output -->
</ProductRq>
Je les compare à l'ensemble Diff suivi:
MyTest.java
Diff diff = DiffBuilder
.compare(xmlExpectedOutput)
.withTest(xmlOutput)
.normalizeWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
.whenElementIsNamed("Audit")
.thenUse(ElementSelectors.byXPath("./TransID", ElementSelectors.byName))
.whenElementIsNamed("NotificationRq")
.thenUse(ElementSelectors.byXPath("./RqUID", ElementSelectors.byName))
.elseUse(ElementSelectors.byNameAndText)
.build()
))
.checkForSimilar()
.build();
Je reçois les différences suivantes quand je lance l'entrée ci-dessus et comparer avec prévu -output.xml:
[Expected child '{http://test.org/standards/intake}RqUID' but was 'null' - comparing <RqUID...> at /ProductRq[1]/SvcRq[1]/NotificationRq[1]/RqUID[1] to <NULL> (DIFFERENT), Expected child 'null' but was '{http://test.org/standards/intake}RqUID' - comparing <NULL> to <RqUID...> at /ProductRq[1]/SvcRq[1]/NotificationRq[1]/RqUID[1] (DIFFERENT)]
Je ne comprends pas pourquoi mon sélecteur d'élément ne fonctionnerait pas, est-ce que je l'utilise incorrectement? Mon objectif est de trouver les identifiants TransmissionId ou NotificationRq/RqUID pour les faire correspondre aux versions de sortie attendues, sinon utiliser le nom et le texte pour les autres éléments car ces éléments contiennent des identifiants uniques qui changent à chaque test et ne peuvent être prédits (en vue de créer plus tard un sélecteur plus complexe, par exemple pour comparer ProductRq via le nom et l'attribut en tant qu'espace de noms). Y at-il quelque chose qui me manque, et suis-je capable de combiner les 2 sélecteurs XPath ensemble plutôt que plusieurs lignes quand/alors et le cas par défaut?
Remarque: le fichier XML est transformé via xslt. L'espace de noms sur PRoductRq n'est pas présent sur le document source; la source est copié, l'espace de noms ajouté à ProductRq puis envoyé pour la sortie ainsi que des suppressions éléments/modifications/ajouts
bonne explication, je pense que j'interprétais mal le sélecteur d'élément byXPath, je pensais que c'était comme si l'élément était nommé ainsi, puis associez cet enfant avec le sélecteur fourni, pas qu'il ne doit utiliser que le RqUID avec le règles par défaut. Je suis finalement arrivé à une solution en mettant en œuvre 2 DifferenceEvaluators mais c'est beaucoup plus propre – jbailie1991