Java: работа с несколькими версиями XML-схем

#java #xml #xsd #jaxb #version

#java #xml #xsd #jaxb #версия

Вопрос:

У меня есть приложение, которое получает XML-сообщение, а затем анализирует его для выполнения дальнейшей обработки.Для того, чтобы это работало в моем приложении, после получения XML-строки я вызываю JAXB marshaller для ее маршалирования в java POJOs, а обработка выполняется здесь после. Эта вещь работает хорошо до тех пор, пока у меня не появится одна версия XML.

Проблема Но проблема возникает, когда существует более одной версии одного и того же XSD. И моему приложению приходится иметь дело с обеими версиями сообщений. Клиенты в мое приложение могут отправлять старую версию xml или они могут отправлять последнюю версию XML.

Для JAXB я должен преобразовать XSD в java pojos с помощью JAVA XJC tool, и проблема возникает, когда я конвертирую последнюю версию XSD, она имеет те же имена классов, что и предыдущая версия, но внутренние поля и иерархия класса отличаются. это вызывает проблемы, даже если я помещаю выходные данные XJC в разные банки для каждой версии.

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

Должен ли я использовать синтаксический анализатор SAX? Я читал, что это не так эффективно по сравнению с JAXB. И после работы над SAX parser в течение последних нескольких дней я обнаружил, что он может быть подвержен ошибкам, поскольку он включает в себя поиск каждого элемента, извлечение из него значений и помещение его в нашу собственную структуру Java, а это требует больших усилий по сравнению с JAXB.

* Вопрос

Есть ли какое-либо простое решение, подобное JAXB?

*

Используемое временное решение Я использовал временное решение, которое меня не устраивает как хорошее решение. Что я сделал, так это создал отдельный jar для каждой версии XSD с помощью инструмента XJC. И создал разные пакеты для каждого jar, например, 1. Pojos для версии 1.2 находятся в jar с базовым пакетом com.cgs.v_12 2. Pojos для версии 2.0 находятся в другом jar с базовым пакетом com.cgs.v_20

я добавил оба в качестве зависимости от maven в свою систему и использую их для обработки разных версий.

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

1. Откуда вы знаете версию входного xml? Вам нужно проанализировать файл, чтобы получить версию, или входные файлы получены из двух разных каналов?

2. Вы можете попытаться преобразовать xml в любом формате версии во внутренний, который не изменится (например, с помощью xslt), и выполнить дальнейшую обработку в этом внутреннем формате.

Ответ №1:

Для JAXB / любого другого решения, которое сопоставляет между XSD -> POJOS, это будет сопоставление 1-1, особенно если POJOS сгенерированы.

Нужно ли (1) сопоставлять весь XML с POJO или (2) подмножество этого XML со статической / фиксированной моделью POJO?

Если (1), поскольку изменения в последующих версиях невозможно предвидеть, я полагаю, что решением для вышеупомянутого будет использование шаблона стратегии для выбора правильных артефактов JAXB на основе версии

Если (2), вы можете изучить использование XPATH, определяя сопоставления XPATH для каждой версии.