Поэтому я довольно часто искал решение этой проблемы, и я надеюсь, что кто-то может указать мне в хорошем направлении.
Мы получаем данные как XML, и у нас есть только XSD для проверки данных. Поэтому я использовал JAXB для генерации классов Java. Когда я пошел на демонтаж образца XML, я обнаружил, что некоторые значения атрибутов отсутствуют. Оказывается, что схема ожидает, что эти атрибуты будут QName, но поставщик данных не определил префикс в XML.
Например, одно значение атрибута XML - это "repository:<uuid>"
, но префикс пространства имен "репозиторий" никогда не определяется в наборе данных. (Ни в коем случае лучшие рекомендации поставщика не позволяют определить это!)
Поэтому, когда я пошел на демонтаж набора образцов, атрибуты QName с указанным префиксом ("репозиторий" в моем примере выше) являются NULL! Таким образом, похоже, что JAXB "выбрасывает" те значения атрибута QName, которые имеют неопределенный префикс пространства имен. Я удивлен, что он не сохраняет даже локального имени.
В идеале я хотел бы поддерживать значение как есть, но похоже, что я не могу сопоставить QName со строкой во время привязки (схема к Java).
Я попытался "вручную" вставить определение пространства имен в XML, и он работает как шарм. Каким будет наименее сложный метод?
Есть ли способ "вставить" отображение/определение пространства имен во время выполнения? Или определить его "глобально" во время привязки?
Самое простое - использовать строки вместо QName. Вы можете использовать настройку javaType
для достижения этой цели.
Если вы хотите добавить отображения префикса/пространства имен во время выполнения, есть несколько способов сделать это:
startDocument
.UnmarshallingContext.environmentNamespaceContext
. Я проверил исходный код, но не смог найти прямой и простой способ сделать это.Я лично использовал бы фильтр SAX/StAX для "предварительной обработки" вашего XML на уровне события.