2014-08-29 2 views
1

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

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

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

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

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

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

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

+1

Я настоятельно рекомендую вам опубликовать соответствующие части вашего CSD и XML-документа. По-прежнему очень вероятно, что XML, который вы reeive не соответствует XSD, что будет проблемой для JAXB un-marshalling. Если вы установили, что XML на самом деле соответствует XSD (например, с помощью онлайн-инструмента проверки), скажите так (так, чтобы SO-помощники убирали его с пути). –

+0

Я задавался вопросом, должен ли я предоставить некоторые подробности, но это было немного сложно на моем планшете. В следующий раз я дам реальную заявку на код. Спасибо за ответ. – raydogg

ответ

2

Простейшим было бы использовать строки вместо QName. Вы можете использовать настройку javaTypeto achieve this.

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

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

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

+0

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

Смежные вопросы