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

1

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

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

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

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

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

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

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

  • 1
    Я настоятельно рекомендую вам опубликовать соответствующие части вашего CSD и XML-документа. Весьма вероятно, что полученный вами XML-файл не соответствует XSD, что станет проблемой для демонтажа JAXB. Если вы установили, что XML на самом деле соответствует XSD (например, с помощью онлайн-инструмента проверки), скажите об этом (так, чтобы помощники SO могли его убрать).
  • 0
    Я задавался вопросом, должен ли я предоставить более подробную информацию, но на планшете это было немного сложно. В следующий раз я предоставлю актуальную ставку кода. Спасибо за ответ.
Теги:
jaxb
xsd
xml-namespaces

1 ответ

2
Лучший ответ

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

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

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

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

  • 0
    Я принял ваши предложения, и это работает. Я в основном реализовал свой собственный XMLStreamReader и оценил ответы для конкретных строк. Это немного ограничивает гибкость, но я надеюсь, что провайдер дат в скором времени решит эту конкретную проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню