5

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

我尝试使用@XmlElementWrapperontext属性,但我得到一个@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>SlideTexttext属性?

谢谢。

更新

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

本质上,如果这可行,我将创建SlideImageSlideTextVideo扩展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>
4

2 回答 2

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:

于 2011-02-03T18:25:57.803 回答
0

添加一个新类Layout

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

public class Layout {
    @XmlAttribute
    private String  text;
}
于 2011-02-03T18:17:41.420 回答