Как сравнить два xml с одним и тем же пространством имен, но разными префиксами, используя java и xmlunit

У меня есть 2 xml-файла:

Проблема в префиксах атрибутов.

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


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

эти два xml одинаковы, с одним и тем же пространством имен, но с разными префиксами. Если я сравниваю с xmlunit -> утверждение не выполняется. Как я могу справиться с этим?

в случае сравнения подобных () или идентичных () у меня есть ошибка:

Ожидалось имя атрибута 'message:MessageNameString', но было 'null'
Ожидалось имя атрибута 'message:MessageVersion', но было 'null'
Ожидалось имя атрибута 'null', но было 'mes:MessageNameString'
Ожидаемое имя атрибута 'null', но было 'mes:MessageVersion'


person Constantine Gladky    schedule 13.11.2012    source источник
comment
Можете ли вы предоставить фактический XML, который вы тестируете? Даже когда я добавляю атрибуты, у меня подобная проверка проходит.   -  person Nick Wilson    schedule 13.11.2012
comment
Могу отправить по электронной почте. Они довольно велики для форм stackoverflow.   -  person Constantine Gladky    schedule 13.11.2012
comment
XML определяет идентичность — должна быть возможность определить подобное на основе XML-определения подобного. например <a xmlns="foo"/> и <foo:a xmlns:foo="foo"/> семантически являются одним и тем же документом. Использование Similar() проблематично, если важен порядок дочерних элементов (часто так и есть). Отстой!   -  person mogsie    schedule 13.06.2014


Ответы (3)


Следующий тест проходит проверку на «похожесть», но не проходит проверку на «идентичность»:

    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() );
    }

Из документов xmlunit API:

  • идентичны: содержание и последовательность узлов в документах точно такие же
  • аналогично: содержимое узлов в документах одинаково, но существуют незначительные различия, например. последовательность родственных элементов, значения префиксов пространств имен, использование подразумеваемых значений атрибутов

Таким образом, использование «похожей» проверки должно дать вам то, что вы хотите.

Изменить: добавлены атрибуты с префиксом, тот же результат.

person Nick Wilson    schedule 13.11.2012
comment
Проблема в префиксах атрибутов. Я исправляю свой пример. Для узлов это работает. - person Constantine Gladky; 13.11.2012

С XMLUnit 1.x:

// Similar
XMLAssert.assertXMLEqual()

// Identical
XMLAssert.assertXMLIdentical()

С XMLUnit 2.x:

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

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

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

См. https://github.com/xmlunit/xmunit#comparing-two-documents

person leaqui    schedule 24.09.2018

person    schedule
comment
Пример // similar неверен. Он возвращает true, когда XML отличается, а не похож. - person leaqui; 25.09.2018