【问题标题】:JAXB2: Mapping nested elements into the same Java classJAXB2:将嵌套元素映射到同一个 Java 类
【发布时间】:2011-02-03 18:09:15
【问题描述】:

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

我尝试在text 属性上使用@XmlElementWrapper,但我得到一个异常,@XmlElementWrapper 只能应用于集合。

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

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

有没有办法将&lt;layout&gt;&lt;text&gt;hello&lt;/text&gt;&lt;/layout&gt; 映射到SlideTexttext 属性?

谢谢。

更新

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

基本上,如果可行,我将创建扩展 SlideSlideImageSlideTextVideo

实际的 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>

【问题讨论】:

  • 幻灯片是复杂类型。将其定义为另一个对象并将另一个放入此类。这不适合你吗?
  • @fmucar:我在上面的帖子中添加了更多推理。
  • 旁注:除了Module 之外的任何类都不需要@XmlRootElement,假设它始终是XML 文档的根元素。
  • 你能得到答案吗?即使我有这样的东西。我知道已经很久了,但你还记得你在这里做了什么吗?

标签: java jaxb jaxb2


【解决方案1】:

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

【讨论】:

  • 我无法让它工作。我和你的一样有@XmlPath,但text 仍然为空。
  • 我使用的是 Moxy 2.3.0-M5,如果它有什么不同的话。 :)
  • 好的,我修好了。我缺少jaxb.properties 文件。哇,这太棒了!谢谢!
【解决方案2】:

添加一个新类Layout

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

public class Layout {
    @XmlAttribute
    private String  text;
}

【讨论】:

  • 可以不定义Layout类吗?我希望在具体的Slide 类中拥有所有信息。谢谢。
  • 您可以尝试在SlideSlideText 中将其设为匿名类。
猜你喜欢
  • 2013-03-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多