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

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

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

Я не хочу объект для <wrapper> быть созданным вообще. Таким образом для класса как

class Root {
    private Entity entity;
}

<entity> элемент должен быть не упорядочен непосредственно в поле объекта.

Действительно ли возможно достигнуть с JAXB?

13
задан UnclickableCharacter 12 July 2014 в 10:49
поделиться

3 ответа

Несмотря на то, что для этого требуется дополнительное кодирование, желаемое немаршалинг выполняется следующим образом с использованием объекта временной оболочки:

@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();
    }

}
7
ответ дан 2 December 2019 в 01:31
поделиться

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

Итак, если я не упущу суть, ответ будет отрицательным - ни JAXB, ни какая-либо другая программа отображения не может этого сделать. Вы можете избежать создания классов, используя что-то, что отображает чисто динамическое отображение (см. Groovy, GPath для примера), но это позволяет избежать создания всех классов, а не просто пропустить один промежуточный уровень в иерархии.

-3
ответ дан 2 December 2019 в 01:31
поделиться

EclipseLink MOXy предлагает реализацию JAXB 2.2 с расширениями. Одна из расширенных возможностей - использовать XPath для навигации по слоям XML, которые вам не нужны в вашей модели предметной области.

Если вы посмотрите на:

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions

, вы заметите, что имя клиента хранится внутри, но это имя является строкой атрибут Заказчика. Это достигается с помощью:

@XmlPath("personal-info/name/text()")
public String getName() {
    return name;
}

Надеюсь, это поможет,

Дуг

5
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: