xmlunit-2

XMLUnit - different element selector for duplicate element names


I,m using XMLunit for comparing XMLs.i have xmls as below.

<e>
 <accounts>
  <number>56482</number>
  <name>ererr</name>
 </accounts>
</e>    
<indicator>
 <e>
  <name>name1</name>
  <value>value1<value>
 </e>
 <e>
  <name>name2</name>
  <value>value2<value>
 </e>
</indicators>

as in above xml, I need to write different element selector conditions for different e i.e I need to write a separate element selector condition for //e and different element selector condition for //indicator/e. right now im using below code

ElementSelectors.conditionalBuilder()
.whenElementIsNamed("e").thenUse(ElementSelectors.byXPath("//indicator/e/name",ElementSelectors.byNameAndText))
                .elseUse(ElementSelectors.byName)
                .build();

but this condition best suited for //indicator/e. I need to have a separate condition like

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

I'm struck here and please suggest me on overcoming this issue.


Solution

  • The conditional builder offers a more generic when which accepts a Predicate<? super Element> so you can code up more specific conditions like

    when(e => "e".equals(e.getNodeName())
        && "indicator".equals(e.getParentNode().getNodeName()))
    

    of course you better add some null-checks and error handling, but you get the idea.