Вставьте дополнительные поля в JAXB маршаллинг - PullRequest
1 голос
/ 29 ноября 2010

При маршалинге некоторых объектов в XML мне нужно вставить дополнительное поле в каждый из результирующих объектов XML - своего рода флаг.Цель состоит не в изменении исходных объектов, а в вставке этой информации в выходной XML.

Есть идеи, если это возможно?

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Есть несколько возможных подходов:

1. Использовать XmlAdapter

Вы можете использовать XAAdapter JAXB. Здесь вы должны создать версию классов с дополнительным полем (адаптированные классы могут расширять оригинал). Затем конвертируйте между ними в адаптер. Поскольку альтернативная версия класса будет содержать дополнительное поле, оно будет выделено.

2. Использовать Binder

Если целью маршала является DOM, то вы можете использовать JAXB's Binder. Он предназначен для сохранения информационного набора, но после маршала он поддерживает связь между объектами и узлами DOM. После завершения маршала вы можете использовать связыватель, чтобы найти связанный с объектом узел и обновить его.

3. Оберните выходную цель

Если вашей выходной целью является что-то вроде ContentHandler или XMLStreamWriter, то при достижении соответствующего состояния вы можете вызвать дополнительные события, которые будут вызываться для вложенной цели маршала.

1 голос
/ 29 ноября 2010

Самый простой способ, которым я могу придумать, это использовать JAXB для маршалинга в DOM, а затем программно вставить вашу дополнительную информацию в этот DOM, а затем перенастроить DOM в XML.

Уродливый и неэффективный, но это лучшее, что я могу придумать.

...