Во-первых, вам нужно каким-то образом определить схему, подходящую для конкретного экземпляра документа. Вы говорите, что документы имеют атрибут schemaLocation
, так что это одно из решений. Обратите внимание, однако, что вам необходимо специально настроить синтаксический анализатор для использования этого атрибута, и вредоносный документ может указать расположение схемы, которое вы не контролируете. Вместо этого я рекомендую получить значение атрибута и использовать его для поиска подходящей схемы во внутренней таблице.
Далее идет доступ к данным. Вы не говорите, почему вы используете три разные схемы. Единственная разумная причина - развивающаяся спецификация данных (т. Е. Схемы представляют версии 1, 2 и 3 тех же данных). Если это не ваша причина, вам нужно переосмыслить свой дизайн.
Если вы пытаетесь поддерживать развивающуюся спецификацию данных, вам нужно ответить на вопрос «как мне поступить с отсутствующими данными». Есть несколько ответов на этот вопрос: один - поддерживать несколько версий кода. С рефакторингом общей функциональности это неплохая идея, но она может легко стать непригодной.
Альтернативой является использование единой кодовой базы и какого-то адаптера объекта, который включает ваши правила. И если вы пойдете по этому пути, JAXB - неправильное решение, поскольку оно связано со схемой. Возможно, вы сможете использовать разрешающий XML-> Java-конвертер: я верю, что XStream будет работать, и я знаю, что версия 1.1 Practical XML будет работать (так как я написал это) - хотя тебе придется построить его самому.
Другая, лучшая альтернатива, в зависимости от сложности схемы, состоит в разработке набора объектов, которые используют XPath для извлечения данных. Я бы, вероятно, реализовал использование «главного» объекта, который содержит выражения XPath для каждого поля, в каждом варианте схемы. Затем создайте легкие объекты-обертки, которые содержат DOM-версию вашего экземпляра документа, и используйте XPath, соответствующий схеме. Однако обратите внимание, что это ограниченный доступ только для чтения.