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

久未见 提交于 2019-12-13 13:00:07

问题


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'


回答1:


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.




回答2:


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



回答3:


With XMLUnit 1.x:

// Similar
XMLAssert.assertXMLEqual()

// Identical
XMLAssert.assertXMLIdentical()

With XMLUnit 2.x:

import static org.xmlunit.assertj.XmlAssert.assertThat;
...

// Similar
assertThat(xmlResult).and(xmlExpected).areSimilar();

// Identical
assertThat(xmlResult).and(xmlExpected).areIdentical();

See https://github.com/xmlunit/xmlunit#comparing-two-documents



来源:https://stackoverflow.com/questions/13358305/how-to-compare-two-xml-with-the-same-namespace-but-different-prefixes-using-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!