2011-09-07 17 views
9

Sto cercando di unmarshall il seguente codice XML utilizzando JAXB:Trattare con JAXB Collezioni

<Works> 
    <Work> 
     <Composers> 
      <Composer> 
       <Name>A name</Name> 
      </Composer> 
      <Composer> 
       <Name>A name 2</Name> 
      </Composer> 
     </Composers> 
    </Work> 
</Works> 

Ho generato tutte le classi che utilizzano XJC. Se voglio accedere alla raccolta Compositori, devo fare questo:

List<Composer> composers = work.getComposers().getComposer(); 

C'è un modo che io possa fare la seguente, invece?

List<Composer> composers = work.getComposers(); 

apprezzo la necessità di un oggetto Compositori come derivato dal XML, ma quando si tratta in Java, avendo un POJO intermedia che memorizza le collezioni sembra un po 'ridondante.

mio XSD è:

<xsd:complexType name="Works"> 
    <xsd:sequence> 
     <xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composers" type="Composers"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composers"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

+0

Avete uno schema che avete usato per generare i POJO? –

+0

Elenco compositori = work.getComposers(). GetComposer(); questo non sembra giusto. Dovrebbe restituirti solo un compositore non un elenco di compositori. Considerando che lista compositori = work.getComposers(); questo sembra corretto. –

+0

Ho aggiunto il mio schema XSD – seedhead

risposta

6

Il plugin @XmlElementWrapper fa esattamente quello che vuoi.

+1

Grazie William! Sfortunatamente questo plugin non supporta JAXB 2.1, solo 2.0. L'unica opzione qui è di effettuare il downgrade a 2.0? – seedhead

+0

Lo sto usando in un progetto con JAXB 2.2.3 senza problemi. Puoi dirmi che errore stai vedendo? –

+0

Nessun errore, ma le classi generate da XJC non contengono le annotazioni @XmlElementWrapper previste. Sto usando Java 6 e JAXB 2.1, stai usando anche Java 6? – seedhead

2

Per chiunque non possa o non voglia utilizzare il plug-in: Se è possibile vivere con una diversa struttura XML, è possibile evitare di generare le classi wrapper aggiuntive semplicemente utilizzando maxoccurs="unbounded" e lasciando fuori l'elemento contenitore. Utilizzando l'esempio originale:

<xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"/> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

produrrà una struttura come questa:

<Work> 
    <Composer> 
     <Name>A name</Name> 
    </Composer> 
    <Composer> 
     <Name>A name 2</Name> 
    </Composer> 
</Work> 

Questo metterà un metodo sul tipo di lavoro che restituisce un oggetto List<Composer>. Sfortunatamente, il metodo è chiamato getComposer anziché getComposers, ma è possibile utilizzare annotations or custom bindings per risolvere il problema.