Как указать порядок атрибутов в XML после использования JAXB, либо в maven, либо в другом месте

#java #xml #maven #jaxb #unmarshalling

#java #xml #maven #jaxb #отмена сопоставления

Вопрос:

Я отменяю сортировку некоторого XML в строку с помощью JAXB. Однако порядок атрибутов отличается от исходного XML при запуске наших сценариев сборки через Maven. Это приводит к сбою некоторых модульных тестов, которые отлично проходят в Eclipse.

Есть идеи, почему это может произойти? Здесь много похожих вопросов, но трудно найти надежный ответ. 🙂

Комментарии:

1. Ваши модульные тесты не должны проверять правильность упорядочения атрибутов.

2. Согласен. Тест просто проверяет большую строку, которая довольно грязная. Но я все еще не понимаю, почему на порядок влияет, если он выполняется в maven.

3. Я предполагаю, что вы используете другую версию Java, поэтому ваш Maven настроен неправильно. И тестирование в Eclipse использует внутренний компилятор Eclipse, который отличается от javac на консоли и, конечно, основан на том, что отличается в Maven, потому что Maven использует консольный javac.

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

Ответ №1:

Порядок, в котором атрибуты отображаются в XML, не имеет значения, в то время как порядок, в котором встречаются элементы. JAXB, как и большинство технологий XML, не гарантирует порядок, в котором будут отображаться атрибуты. Ваши модульные тесты должны будут учитывать это.

Примечание

При использовании Unmarshaller amp; Marshaller выходной XML основан на метаданных сопоставления, а не на порядке входного XML. Метаданные позволяют указывать порядок элементов, но не атрибуты. Вы можете использовать JAXB Binder для маршалирования в существующий документ (DOM).

Ответ №2:

Вы должны переписать свои модульные тесты, чтобы следовать правилам правильно сформированного XML, если они тестируют XML. Согласно спецификации XML, порядок атрибутов не важен, и вашему анализатору не нужно его применять. Это

 <element one="1" two="2" />
  

это то же самое, что

 <element two="2" one="1" />
  

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

 <element></element>
  

это то же самое, что

 <element/>
  

Ваш анализатор может выбрать использование одного или другого, и это не должно подводить ваши тесты, если они проверяют допустимый XML.

Ответ №3:

Небольшое обновление.

Итак, я немного лучше разобрался в ваших ответах и смог сравнить некоторые объекты jaxb в моем модульном тестировании. Но это заняло некоторое время.

Я обнаружил, что эта библиотека действительно помогла мне, и я пошел дальше:

XMLUnit

Ответ №4:

Ваш модульный тест должен использовать Unmarshaller amp; Marshaller XML, чтобы ваш тест основывался на метаданных сопоставления, а не на порядке (или строке) входного XML.

Однако удобочитаемость для чтения человеком часто является приятной особенностью и позволяет вам «различать» выходные файлы, используя @XMLType(пропорциональный ….) вместо упорядочения атрибутов, что дает вам то, что вам нужно.

@XMLType(пропорциональный = { «elementone», «elementtwo», «attributeone», «attributetwo»
})