Как узнать схему, прежде чем разобраться - PullRequest
1 голос
/ 14 апреля 2011

Сценарий:

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

Проблема:

Здесь поток программы зависит от Exception, выданного unmarshal().

Вопрос:

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Есть несколько вариантов:

Вариант № 1 - создание JAXBContext на моделях с несколькими доменами

Если модели для этих двух схем совместимы (являются полностью независимыми или имеют общие типы, которые аннотируются одинаково), то просто создайте JAXBContext для всех объектов домена, вместо того, чтобы иметь один для каждой схемы.

Опция № 2 - вход StAX

Если наличие разных XML-схем означает наличие разных корневых элементов, я бы создал StAX XMLStreamReader для просмотра корневого элемента и затем выбрал маршаллера для использования. Затем демонтируйте этот XMLStreamReader.

Вариант № 3 - сначала проверить документ XML

Вы можете использовать API-интерфейсы javax.xml.validation, чтобы сначала проверить документ, а затем на основе результатов выбрать unmarshaller.

1 голос
/ 14 апреля 2011

Возможно, вам стоит взглянуть на использование SAX-парсера и обработать две структуры вручную в одном обработчике.Другая возможность - создать новую схему, которая допускает две опции.

Если бы у меня был полный контроль над схемами, я бы посмотрел на второй вариант.Если бы схемы ответов были простыми и / или имели схожую структуру, я бы посмотрел на использование SAX.

...