JAXB: две версии XSD, одна объектная модель - PullRequest
2 голосов
/ 18 июля 2011

У меня есть две версии схемы XSD. XSD очень похожи, хотя пространство имен XML отличается (пространство имен xml используется для управления версиями). Я хотел бы разобрать две версии, используя одну и ту же объектную модель. JAXB используется для генерации объектной модели.

Существует ли простой способ считывания двух немного разных моделей XML в одну и ту же объектную модель?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Для решения этой проблемы можно использовать реализацию JAXB (Metro, MOXy, JaxMe и т. Д.) С анализатором StAX (RI, Woodstox и т. Д.).Предполагая, что помимо имен, что ваши документы имеют обратную совместимость, вы можете сопоставить вашу объектную модель с новейшей схемой.Затем вы обманете свою реализацию JAXB, думая, что все версии документа используют это пространство имен.Хитрость заключается в том, чтобы использовать StreamReaderDelegate из API StAX.

Для аналогичного примера

2 голосов
/ 18 июля 2011

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

Можно попробовать прочитать документ в модели DOM (например, org.w3c.dom.Document), программно установить URI пространства имен DOM, совпадающий с идентификатором в модели класса JAXB, а затем демонтировать DOM в JAXB (используя Unmarshaller.unmarshall(document). Производительность этого отстой, но это может не иметь значения для вас.

В качестве помощника посмотрите на этот PDF , описывающий лучшие практики для схем управления версиями (подсказка: изменение URI пространства имен не лучшая практика ...)

...