JAXB проблема с отсутствующим определением пространства имен

Поэтому я довольно долго искал решение этой конкретной проблемы и надеюсь, что кто-то может указать мне правильное направление.

Мы получаем данные в формате XML, и у нас есть только XSD для проверки данных. Поэтому я использовал JAXB для генерации классов Java. Когда я пошел демаршировать образец XML, я обнаружил, что некоторые значения атрибутов отсутствуют. Оказывается, что схема ожидает, что эти атрибуты будут QName, но поставщик данных не определил префикс в XML.

Например, одно значение атрибута XML "repository:<uuid>", но префикс пространства имен "хранилище" никогда не определяется в наборе данных. (Не берите в голову лучшие методы провайдера, предлагайте определить это!)

Поэтому, когда я отправил демонтировать набор образцов, атрибуты QName с указанным префиксом ("хранилище" в моем примере выше) были равны NULL! Таким образом, похоже, что JAXB "выбрасывает" те значения атрибута QName, которые имеют неопределенный префикс пространства имен. Я удивлен, что это не сохраняет даже местное название.

В идеале я хотел бы сохранить значение как есть, но похоже, что я не могу сопоставить QName со строкой во время привязки (схема к Java).

Я попытался "вручную" вставить определение пространства имен в XML, и это работает как шарм. Каков был бы наименее сложный способ сделать это?

Есть ли способ "вставить" отображение / определение пространства имен во время выполнения? Или определить это "глобально" во время привязки?

1 ответ

Решение

Простейшим было бы использовать строки вместо QName. Вы можете использовать javaType настройка для достижения этой цели.

Если вы хотите добавить сопоставления префикса / пространства имен во время выполнения, есть довольно много способов сделать это:

  • Как и выше, вы можете предоставить свой собственный конвертер QName, который будет учитывать ваши префиксы.
  • Вы можете поместить фильтр SAX или StAX между ними и объявить дополнительные префиксы в startDocument,
  • Что вам действительно нужно, так это добавить ваши префиксные сопоставления в UnmarshallingContext.environmentNamespaceContext, Я проверил исходный код, но не смог найти прямой и простой способ сделать это.

Лично я бы внедрил фильтр SAX/StAX, чтобы "предварительно обработать" ваш XML на уровне событий.

Другие вопросы по тегам