JAXB2: отображение вложенных элементов в один и тот же класс Java - PullRequest
5 голосов
/ 03 февраля 2011

У меня проблемы с попыткой отобразить вложенные элементы в один и тот же класс Java.

XML

Я пытаюсь установить атрибут id и элемент text в класс SlideText.

<module name="test project">
    <slide id="1">
        <layout>
            <text>hello</text>
        </layout>
    </slide>
</module>

Модуль класса

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Module {
    @XmlAttribute
    private String  name;

    @XmlElements({
        @XmlElement(name = "slide", type = SlideText.class)
    })
    private Slide   slide;
}

Класс слайдов

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class Slide {
    @XmlAttribute
    private String  id;
}

Класс SlideText

Я пытался использовать @XmlElementWrapper для свойства text, но получаю исключение, что @XmlElementWrapper можно применить только к коллекции.

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    // how to map this to layout/text elements?
    private String  text;
}

Есть ли способ сопоставить <layout><text>hello</text></layout> свойство SlideText text?

Спасибо.

UPDATE

Чтобы проиллюстрировать, что я пытаюсь сделать здесь, слайд может быть любого типа в зависимости от того, какой макет используется. module знает, что это slide, но не знает, что это за слайд, поэтому у меня есть абстрактный класс Slide.

По сути, если это сработает, я буду создавать SlideImage и SlideTextVideo, которые расширяют Slide.

Вот как выглядит настоящий XML-файл: -

<module name="test project">
    <slide id="1">
        <layout-text>
            <text>hello</text>
        </layout-text>
    </slide>
</module>
<module name="test project">
    <slide id="2">
        <layout-image>
            <image-path>img.jpg</image-path>
        </layout-image>
    </slide>
</module>
<module name="test project">
    <slide id="3">
        <layout-text-video>
            <text>hello</text>
            <video-path>a.mp4</video-path>
        </layout-text-video>
    </slide>
</module>

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

Если вы используете EclipseLink JAXB (MOXy) , тогда вы можете использовать для этого расширение @XmlPath (я технический лидер MOXy):

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    @XmlPath("layout/text/text()")
    private String  text;

}

Используя стандартный JAXB, вы можете использовать XmlAdapter:

0 голосов
/ 03 февраля 2011

Добавить новый класс Layout:

public class SlideText extends Slide {
    @XmlElement
    private Layout layout;
}

public class Layout {
    @XmlAttribute
    private String  text;
}
...