2011-02-02 12 views
14

Necesito un poco de ayuda con las Anotaciones de JAXB y no pude encontrar buenos documentos que me ayuden a resolver esto.JAXB Anotaciones

Tengo una clase que quiero convertir en XML. Mi clase es el siguiente:

@XmlRootElement(name="car") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
    "vid", 
    "make", 
    "model", 
    "recalls", 
    "engSpec" 
}) 

public class Car { 
    @XmlElement(name="vid", required=true) 
    private String vid; 
    @XmlElement(name="make", required=true) 
    private String make; 
    @XmlElement(name="model", required=true) 
    private String model; 
    @XmlElement(name="recalls", required=true) 
    private ArrayList<Recall> recalls; 
    @XmlElement(name="engSpec", required=true) 
    private EngSpec engSpec; 
... 

Y la clase de recordatorio se ve así:

@XmlRootElement(name = "recall") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
     "type", 
     "date" 
}) 
public class Recall { 
    @XmlElement(name="type", required=true) 
    private String type; 
    @XmlElement(name="date", required=true) 
    private String date; 
... 

por lo que produce esta salida XML:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
</recalls> 
<recalls> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

Pero lo que quiero ArrayList para mostrar diferentemente, como esto:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <recall> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
    </recall> 
    <recall> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
    </recall> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

¿Alguna idea de cómo puedo hacer esto? Creo que el problema es con mi esquema, pero yo lo uso para el cálculo de referencias:

JAXBContext jc = JAXBContext.newInstance(Car.class); 
Marshaller marsh = jc.createMarshaller(); 
marsh.marshal(car, out); 

Alguna idea de cómo solucionar este problema? ¡Gracias!

+5

Por cierto, si el nombre de su propiedad es el mismo que el elemento XML, no necesita especificar la anotación '@ XmlElement' ... le ahorra un montón de tipeo. :) – limc

Respuesta

31

Prueba esto:

@XmlRootElement(name="car") 
... 
public class Car { 
    ... 

    @XmlElementWrapper(name="recalls") // this name=... can be omitted, as it 
             // is the same as the field name 
    @XmlElement(name="recall") 
    private ArrayList<Recall> recalls; 
} 

Desde el documentation:

XmlElementWrapper: Genera un elemento contenedor alrededor representación XML. Esto está destinado principalmente a ser usado para producir un elemento XML envoltorio alrededor de las colecciones.

+1

¡Impresionante, esto funcionó de maravilla! ¡Gracias! –

Cuestiones relacionadas