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

By | January 12, 2018
Questions:

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’

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.

Questions:
Answers:
// identical
XMLAssert.assertXMLEqual(XMLUnit.compareXML(control, test), true)
// similar
XMLAssert.assertXMLEqual(XMLUnit.compareXML(control, test), false)

Leave a Reply

Your email address will not be published. Required fields are marked *