Подтвердить что ты не робот

Обработка вложенных элементов в JAXB

Мне интересно, возможно ли JAXB не создавать объект Java для элементов XML, которые служат в качестве оберток. Например, для XML следующей структуры

<root>
    <wrapper>
        <entity/>
    </wrapper>
</root>

Я не хочу, чтобы объект для <wrapper> создавался вообще. Итак, для класса типа

class Root {
    private Entity entity;
}

Элемент <entity> должен быть немаршрутизирован непосредственно в поле объекта.

Можно ли достичь с помощью JAXB?

4b9b3361

Ответ 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 для примера), но это позволяет избежать создания всех классов, а не просто пропускать один промежуточный уровень в иерархии.