Правильный способ разархивировать пустые строки как ноль с JAXB - PullRequest
4 голосов
/ 16 марта 2012

Мне приходится работать с большими документами XML, которые часто неправильно обрабатывают недостающие данные атрибутов.Вместо того, чтобы просто пропустить атрибут с отсутствующими данными, атрибут указывается с пустым строковым значением.Это вызывает проблему при демаршаллинге, поскольку пустая строка равна значению.

Например, что должно быть

<SOME_ELEMENT attr1="someValue"/>

Вместо

<SOME_ELEMENT attr1="someValue" attr2="" attr3=""/>

Я пытаюсь найти «правильный» способ изящной обработки этого плохо сформированного XML.Цель состоит в том, чтобы обрабатывать атрибут, как если бы он был опущен, когда значением атрибута является пустая строка, а пустая строка никогда не является допустимым значением для этого атрибута (например, целых чисел).

В настоящее время я использую XMLAdapters для перевода этих пустых строк в ноль (как предложено в этом посте ), но это кажется неправильным решением.Многие из атрибутов в документах, над которыми я работаю, уже используют адаптеры типов, совместно используемые из другого кода, и, похоже, нет способа указать более одного адаптера XML для атрибута.

Существует ли стандартспособ справиться с такой ситуацией, которую я только что пропустил?

Спасибо!

РЕДАКТИРОВАТЬ

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

Ответы [ 2 ]

0 голосов
/ 07 июля 2012

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

Похоже, ответ Скаффман JAXB: как заставить JAXB НЕ разархивировать пустую строку до 0 , ссылка в описании - лучший вариант.

0 голосов
/ 04 апреля 2012

Я думаю, что шаблон, которому вы хотите следовать, состоит в следующем: Настройка обработки ошибок процесса unmarshall JAXB

С элементом XML можно указать, что он равен нулю (следующее).В случае строковых типов пустые элементы и атрибуты (а иногда и отсутствующие элементы) можно интерпретировать как пустые строки.Следовательно, вы должны рассматривать свою логику как бизнес-логику, которая обрабатывается с помощью события afterUnmarshal.

<foo xsi:nil="true" />
...