Обработка вложенных элементов в JAXB
Мне интересно, возможно ли JAXB не создавать объект Java для элементов XML, которые служат в качестве оберток. Например, для XML следующей структуры
<root>
<wrapper>
<entity/>
</wrapper>
</root>
Я не хочу, чтобы объект для <wrapper>
создавался вообще. Итак, для класса типа
class Root {
private Entity entity;
}
Элемент <entity>
должен быть немаршрутизирован непосредственно в поле объекта.
Можно ли достичь с помощью JAXB?
Ответы
Ответ 1
Несмотря на то, что для этого требуется дополнительное кодирование, желаемый unmarshalling может быть выполнен таким образом с использованием объекта временной оболочки:
@XmlRootElement(name = "root")
public class Root {
private Entity entity;
static class Entity {
}
static class EntityWrapper {
@XmlElement(name = "entity")
private Entity entity;
public Entity getEntity() {
return entity;
}
}
@XmlElement(name = "wrapper")
private void setEntity(EntityWrapper entityWrapper) {
entity = entityWrapper.getEntity();
}
}
Ответ 2
EclipseLink MOXy предлагает реализацию JAXB 2.2 с расширениями. Одной из расширенных возможностей является использование XPath для навигации по уровням XML, который вам не нужен в вашей модели домена.
Если вы посмотрите на:
http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions
вы заметите, что имя Клиента хранится внутри, но это имя является атрибутом String для Клиента. Это достигается с помощью:
@XmlPath("personal-info/name/text()")
public String getName() {
return name;
}
Я надеюсь, что это поможет,
Дуга
Ответ 3
Весь смысл JAXB или других систем отображения состоит в том, чтобы сопоставить элементы и их иерархию с классами. В вашем примере вы, похоже, хотите, чтобы JAXB каким-то образом знал, что он может маршалировать сущность в оболочку/сущность и наоборот, фактически не создавая класс, используемый для сопоставления оболочки, и связь между корнем и сущностью. Который, как представлено, примерно эквивалентен спросить, как подключить автомобильный двигатель к колесам без карданного вала.
Итак, если мне не хватает точки, ответ не будет - ни JAXB, ни какая-либо другая программа сопоставления не могут это сделать. Вы можете избежать создания классов, используя что-то, что делает отображение чисто динамически (см. Groovy, GPath для примера), но это позволяет избежать создания всех классов, а не просто пропускать один промежуточный уровень в иерархии.