2011-02-03 4 views
5

Sto riscontrando problemi nel tentativo di mappare elementi nidificati nella stessa classe Java.JAXB2: mappatura di elementi nidificati nella stessa classe Java

XML

Quello che sto cercando di fare qui è di impostare id attributi e text elemento nella SlideText classe.

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

classe Module

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

    @XmlElements({ 
     @XmlElement(name = "slide", type = SlideText.class) 
    }) 
    private Slide slide; 
} 

Classe Slide classe

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class Slide { 
    @XmlAttribute 
    private String id; 
} 

SlideText

I t ried usando @XmlElementWrapper su text proprietà, ma ottengo un'eccezione che @XmlElementWrapper può essere applicato solo a una raccolta.

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

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

Esiste un modo per mappare <layout><text>hello</text></layout> in s' SlideTexttext proprietà?

Grazie.

UPDATE

per illustrare ciò che sto cercando di realizzare qui, la slitta può essere di qualsiasi tipo a seconda di ciò che il layout viene utilizzato. A module sa che è un slide ma non sa quale diapositiva è, motivo per cui ho la classe astratta Slide.

In sostanza, se questo funziona, creerò SlideImage e SlideTextVideo che si estende Slide.

Ecco come il file XML attuale assomiglia a: -

<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

Slide è un tipo complesso. Definirlo come un altro oggetto e posizionare l'altro in questa classe. Questo non funziona per te? – fmucar

+0

@fmucar: ho aggiunto più ragionamenti al mio post sopra. – limc

+1

Nota a margine: non è necessario '@ XmlRootElement' su qualsiasi classe diversa da' Modulo', assumendo che sarà sempre l'elemento principale del documento XML. – earldouglas

risposta

3

Se si utilizza EclipseLink JAXB (MOXy) allora è possibile sfruttare l'estensione @XmlPath per questo (I sono il lead tecnologico 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; 

} 

Utilizzando standard di JAXB si potrebbe sfruttare un XMLAdapter:

+0

Non riesco a farlo funzionare. Ho avuto '@ XmlPath' proprio come il tuo, ma il' testo' è ancora nullo. – limc

+0

Sto usando Moxy 2.3.0-M5, se fa alcuna differenza. :) – limc

+1

Ok, l'ho risolto. Mi manca il file 'jaxb.properties'. Wow, è fantastico! Grazie! – limc

0

aggiungere una nuova classe Layout:

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

public class Layout { 
    @XmlAttribute 
    private String text; 
} 
+1

È possibile non definire la classe 'Layout'? Spero di avere tutte le informazioni nelle concrete lezioni di 'Slide'. Grazie. – limc

+0

Si potrebbe provare a renderlo una classe anonima all'interno di 'Slide' o' SlideText'. – earldouglas