Только для JAXB XML Marshalling Object, но для демаршаллинга требуется полная структура? - PullRequest
1 голос
/ 18 января 2012

Я использую стандартный JAXB API для работы с XML. Мне нужно маршалировать, а затем демаршалировать объект (поэтому результат должен быть тем же объектом). Я сначала маршал в строку, а затем сделать наоборот - демаршал из строки в объект.

Проблема в том, что Marshaller.marshal (obj, os) дает мне только дочерний (заключенный в XML). Когда я пытаюсь выполнить демаршализацию обратно, я получаю сообщения об ожидаемых отсутствующих родительских тегах .

например. (1) Строка Marshalled для объекта "FieldSet":

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIELD1>field1</FIELD1>
<FIELD2>field2</FIELD2>

(2) Попытка разархивировать эту строку XML в объект «FieldSet»:

javax.xml.bind.UnmarshalException: имя тега "FIELD1" не допускается. Возможные имена тегов: - со связанным исключением: [com.sun.msv.verifier.ValidityViolation: имя тега «FIELD1» не допускается. Возможные имена тегов: «Родитель»]

В схеме «Родитель» - это элемент верхнего уровня, который должен предшествовать «FieldSet».

Почему эти стандартные операции JAXB не симметричны, и что мне нужно сделать, чтобы синхронизировать их и избежать проблемы, связанной с отсутствием только у ребенка или отсутствием родителя? Благодаря.

1 Ответ

0 голосов
/ 18 января 2012

Чтобы предоставить информацию о корневом элементе, вы можете сделать одно из следующего:

1 - Аннотируйте класс, который вы аннотируете с помощью @XmlRootElement

@XmlRootElement
public class FieldSet {
}

2 - обернуть объект, который вы собираете, экземпляром JAXBElement

QName qName = new QName("root");
JAXBElement<FieldSet> jaxbElement = new JAXBElement<FieldSet>(qName, FieldSet.class, fieldSet);
...