2009-05-07 17 views
6

Sto parsing di un documento XML che ha nodi come la seguente:Utilizzando JAXB per unmarshall elementi con diversi nomi/dinamici

<objects> 
    <dog> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </dog> 
    <cat> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </cat> 
</objects> 

Gli elementi data1, data2, dati3 sono sempre coerenti. Solo il tag principale varia. Nel mio modello a oggetti ho un singolo oggetto che rappresenta tutti questi casi. Come posso ottenere JAXB per gestire questo caso senza conoscere in anticipo il nome dell'elemento?

@XMLAnyElement corrisponde a tutti gli oggetti ma non crea un oggetto del tipo appropriato; Ricevo un elenco di oggetti Node invece del mio oggetto. Il mio scopo attualmente sembra qualcosa di simile:

public class MyObject { 
    protected String otherData; 

    @XmlAnyElement 
    @XmlElementWrapper(name = "objects") 
    protected List<MyChildObject> childObjects; 
} 

public class MyChildObject { 
    protected String data1; 
    protected String data2; 
    protected String data3; 
} 

Delle idee come gestire questo caso a corto di cambiare il formato XML in ingresso da usare <object type="dog"> elementi?

risposta

6

Se il nome è davvero dinamico, allora non penso che JAXB ti possa aiutare. Se hai un numero definito di vari nomi di elementi, potresti usare l'ereditarietà come l'altro post suggerito. Se il numero di elementi e nomi è sconosciuta mi consiglia di utilizzare qualcosa di simile:

@XmlMixed 
@XmlAnyElement 
public List<Object> getObjects() { 
    return objects; 
} 

Questo porterebbe l'elemento è un solo un elemento DOM. È quindi possibile utilizzare JAXB una seconda volta per passare da ciascuno degli elementi al tipo personalizzato.

Questo sarebbe se si dovesse usare JAXB. Potresti trovare più semplice utilizzare direttamente le API SAX o DOM per dati come questo. JAXB è veramente inteso per dati ben definiti che possono essere rappresentati come uno schema.

+0

Grazie, ha senso. Stiamo andando avanti e cambiamo lo schema dal momento che abbiamo quell'abilità per ora. – chetan

0

È possibile utilizzare l'ereditarietà:

@XmlRootElement(name = "dog") 
public class MyDogObject extends MyChildObject { 
    //nothing here 
} 

@XmlRootElement(name = "cat") 
public class MyCatObject extends MyChildObject { 
    //nothing here 
} 

In questo modo si consente di affrontare con lo stesso tipo di oggetto, MyChildObject, eppure flessibile controllare la struttura XML. Un altro vantaggio è che dovresti definire nodi XML specifici per cani/gatti in futuro: possono essere mappati su quella sottoclasse corrispondente ma non sull'altra, come previsto.

+0

Questo presuppone che conosca in anticipo l'universo dei nomi degli oggetti in modo da poter creare sottoclassi. Per il momento lo faccio, ma sembra uno spreco. – chetan

Problemi correlati