JAXB2:将嵌套元素映射到同一Java类中

时间:2011-02-03 18:09:15

标签: java jaxb jaxb2

我在尝试将嵌套元素映射到同一个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的{​​{1}}属性?

感谢。

更新

为了说明我在这里要完成的任务,幻灯片可以是任何类型,具体取决于使用的布局。 text知道它是module,但它不知道它是什么幻灯片,这就是为什么我有抽象的slide类。

基本上,如果这样做,我将创建扩展Slide的{​​{1}}和SlideImage

以下是实际XML文件的外观: -

SlideTextVideo

2 个答案:

答案 0 :(得分:3)

如果您使用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:

答案 1 :(得分:0)

添加新课程Layout

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

public class Layout {
    @XmlAttribute
    private String  text;
}