Компилятор JAXB и порядок атрибутов - PullRequest
5 голосов
/ 30 ноября 2009

Я хотел бы контролировать порядок атрибутов в файлах .java, сгенерированных компилятором JAXB.

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

Каждый раз, когда запускается компилятор JAXB, группы атрибутов появляются в другом порядке, даже без изменений в схеме. В компиляторе нет очевидной опции, предотвращающей такое поведение.

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

Любые предложения приветствуются.

Спасибо, Dave

Ответы [ 4 ]

4 голосов
/ 04 февраля 2010

Видимо, в JAXB 2.0 вы можете использовать аннотацию @XmlAccessorOrder или @XmlType (propOrder =)

1 голос
/ 01 декабря 2009

Если вам нужно выполнить текстовое сравнение XML-документов, есть более эффективные способы сделать это, чем пытаться контролировать вывод XML-структуры, которая не различает порядок атрибутов.

Например, есть XMLUnit , который является расширением junit специально для утверждений XML, и он довольно хорошо обрабатывает пробелы и порядок.

Более общим решением является XOM Canonicalizer , который выводит XML DOM, так что порядок следования атрибутов и пробелы предсказуемы. Очень удобно.

Итак ... пусть JAXB (или любой другой) генерирует XML так, как считает нужным, затем пропускает выходные данные через XMLUnit или XOM и сравнивает. Это имеет дополнительное преимущество: он не зависит от JAXB, он будет работать с любым сгенерированным XML.

1 голос
/ 30 ноября 2009

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

Edit: Попытка управлять сгенерированным XML с помощью манипулирования порядком исходного кода Java кажется хрупким способом ведения дел. Конечно, это только для тестирования, поэтому, если что-то сломается, код все равно может работать правильно. Люди постоянно меняют порядок исходного кода, иногда случайно, и это будет раздражать или неуловимый источник проблем, если вам придется полагаться на определенный порядок.

Что касается способов сравнения данных XML с использованием инструментов XML, лично я никогда не делал этого в больших масштабах, но по этой ссылке упоминается несколько бесплатных инструментов . Для меня расширение JUnit, предоставляющее утверждения, относящиеся к XML, было бы моим первым шагом, поскольку это могло бы хорошо интегрироваться с моими существующими тестами. В противном случае, поскольку вы в основном ищете точную эквивалентность, вы можете просто проанализировать два XML-файла, затем выполнить итерацию по узлам в «ожидаемом» файле и посмотреть, присутствуют ли эти узлы в «фактическом» файле. Затем просто проверьте другие узлы, которые вы не ожидаете увидеть.

0 голосов
/ 02 декабря 2009

Эта тема предоставляет отличное решение моей проблемы.

Использование XSL для сортировки атрибутов

Один из ответов содержит преобразование xsl, которое просто переупорядочивает атрибуты. Работает отлично, если немного медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...