2011-02-03 60 views
5

我在嘗試將嵌套元素映射到相同的Java類時遇到了問題。JAXB2:將嵌套元素映射到相同的Java類中

XML

我想在這裏做的是設置id屬性和text元到SlideText類。

<module name="test project"> 
    <slide id="1"> 
     <layout> 
      <text>hello</text> 
     </layout> 
    </slide> 
</module> 

Module類

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Module { 
    @XmlAttribute 
    private String name; 

    @XmlElements({ 
     @XmlElement(name = "slide", type = SlideText.class) 
    }) 
    private Slide 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; 
} 

有沒有一種方法來映射到<layout><text>hello</text></layout>SlideTexttext財產?

謝謝。

UPDATE

爲了說明什麼,我想在這裏完成,幻燈片可以是任何類型取決於使用什麼佈局。 A module知道這是一個slide,但它不知道它是什麼幻燈片,這就是爲什麼我有抽象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> 
+0

幻燈片是一個複雜的類型。將其定義爲另一個對象,並將其他對象放入此類。這不適合你嗎? – fmucar 2011-02-03 18:12:43

+0

@fmucar:我在上面的帖子中增加了更多推理。 – limc 2011-02-03 18:20:12

+1

注意事項:假設它始終是XML文檔的根元素,您不需要`Module`以外的任何類上的`@ XmlRootElement`。 – earldouglas 2011-02-03 18:21:16

回答

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:

0

添加一個新類Layout

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

public class Layout { 
    @XmlAttribute 
    private String text; 
}