JAXB2:将嵌套元素映射到同一Java类中
我在尝试将嵌套元素映射到同一个Java类时遇到了麻烦。
XML
我在这里要做的是将id
属性和text
元素设置为SlideText
类。
hello
模块类
@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类
我尝试在text
属性上使用@XmlElementWrapper
,但我得到一个exception,即@XmlElementWrapper
只能应用于集合。
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class SlideText extends Slide { // how to map this to layout/text elements? private String text; }
有没有办法将hello
SlideText
到SlideText
的text
属性中?
谢谢。
UPDATE
为了说明我在这里要完成的任务,幻灯片可以是任何类型,具体取决于使用的布局。 module
知道它是slide
但它不知道它是什么幻灯片,这就是为什么我有抽象的Slide
类。
基本上,如果这样做,我将创建SlideImage
和SlideTextVideo
,扩展Slide
。
以下是实际XML文件的外观: –
hello img.jpg hello a.mp4
如果您使用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:
添加新类Layout
:
public class SlideText extends Slide { @XmlElement private Layout layout; } public class Layout { @XmlAttribute private String text; }