Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compare two xml with the same namespace but different prefixes using java and xmlunit

I have 2 xml files:

The problem is in attributes prefixes.

<element xmlns:prefix1="namespace" prefix1:attribute="some value">Some text</element>


<element xmlns:prefix2="namespace" prefix2:attribute="some value">Some text</element>

these two xml are the same, with the same namespace, but with different prefixes. If I compare with xmlunit -> assertion fails. How can I handle it?

in case of similar() or identical() comparison I have error:

Expected attribute name 'message:MessageNameString' but was 'null'
Expected attribute name 'message:MessageVersion' but was 'null'
Expected attribute name 'null' but was 'mes:MessageNameString'
Expected attribute name 'null' but was 'mes:MessageVersion'

like image 559
Constantine Gladky Avatar asked Nov 13 '12 09:11

Constantine Gladky


1 Answers

The following test passes the "similar" check but fails the "identical" check:

    String control = "<prefix1:element xmlns:prefix1=\"namespace\" prefix1:attribute=\"x\">Some text</prefix1:element>";
    String test = "<prefix2:element xmlns:prefix2=\"namespace\" prefix2:attribute=\"x\">Some text</prefix2:element>";
    try
    {
        Diff diff = XMLUnit.compareXML( control, test );
        assertTrue( "Similar", diff.similar() );
        assertTrue( "Identical", diff.identical() );
    }
    catch ( Exception e )
    {
        fail( e.getMessage() );
    }

From the xmlunit API docs:

  • identical: the content and sequence of the nodes in the documents are exactly the same
  • similar: the content of the nodes in the documents are the same, but minor differences exist e.g. sequencing of sibling elements, values of namespace prefixes, use of implied attribute values

So using the "similar" check should give you what you want.

Edit: added prefixed attributes, same result.

like image 184
Nick Wilson Avatar answered Oct 05 '22 16:10

Nick Wilson