我在尝试将嵌套元素映射到同一个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
答案 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;
}