2010-07-18 20 views
22

Qual è il modo migliore per convertire XML in oggetti Java?Conversione di oggetti XML in Java

Non voglio una rappresentazione simile, ma vorrei estrarre determinati dati dall'XML e popolare un oggetto Java. Ho dato un'occhiata a XStream, ma non mi è piaciuto molto il tipo di "mossa verso il basso, verso l'alto". Io preferirei un DOM come oggetto durante la scrittura di convertitori ...

+0

Xstream guarda bene l'unica cosa è che avrei preferito lavorare con l'attuazione di JDOM HierarchicalStreamReader .... Credo che avrei potuto lanciarlo ma questo sembra un po 'strano .... c'è un modo per usare i convertitori ma usando il lettore JDOM? –

risposta

11

So che tutti amano le soluzioni automatiche come JAXB e simili, ma consiglierei le implementazioni codificanti a mano javax.xml.bind.Marshaller e javax.xml.bind.Unmarshaller per ottenere esattamente ciò che si desidera senza riempire inutilmente lo spazio di perm gen. Usa JDOM per analizzare XML e mappare i valori in oggetti Java usando XPath. Sarà un po 'di lavoro farlo una volta, ma avrai esattamente ciò di cui hai bisogno e niente di più.

+0

Perché parli di PermGen? – Abdull

+3

Dove pensi che vada il codice byte generato da JAXB? Potrebbe essere discutibile con JDK8: non più perm gen. Ho scritto questa risposta cinque anni fa. – duffymo

2

Non sono del tutto sicuro se questo è quello che stai cercando, ma è possibile utilizzare qualcosa come XMLBeans per legare oggetti XML a Java. Ho dovuto usarlo in un precedente datore di lavoro. Sfortunatamente, era un sistema esistente e dovevo solo manipolare gli oggetti e non dovevo produrre la libreria che li contiene. Inoltre, non sono sicuro di quanto funzionerà senza un XSD (non hai menzionato se ne avevi uno o meno).

3

Mi piace Simple e ho trovato molto facile lavorare con. Produce un like per la rappresentazione come se così forse non è proprio quello che stai cercando.

Se stai cercando una soluzione DOM-like, forse un JDom sarebbe adatto.

21

Se si dispone di uno schema XML, JAXB è bello, come parte del JDK. Genera classi java eseguendo per es. xjc -p foo myschema.xsd

Per leggere un file XML e ottenere di nuovo un oggetto (da classi generate dallo strumento xjc):

JAXBContext context = JAXBContext.newInstance(FooObj.class); 
    Unmarshaller unMarshaller = context.createUnmarshaller(); 
    FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml")); 

Si possono fare cose simili se desideri solo parti di un documento XML convertito in un oggetto , dovresti ad es essere in grado di dare a JAXB parte di un documento DOM, invece di un intero file come fatto sopra.

+1

+1 - È anche possibile utilizzare le implementazioni JAXB (JSR-222) quando si inizia dalle classi Java. Hai solo bisogno di aggiungere annotazioni dove vuoi che la rappresentazione XML differisca dall'impostazione predefinita: http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html –

3

È possibile utilizzare Castor per la comoda conversione di XML in Java e viceversa.

Con Castor, è possibile

  1. conversione Facilità: un semplice Marshaller e unmarshaller rende la conversione di XML per Java e ritorno estremamente facile.
  2. Mapping: è possibile creare un file di mapping per limitare la quantità di dati da convertire da XML a Java e viceversa.
+0

I file di mappatura delle ruote sono tuttavia facili e intuitivi : * puoi passare il valore come parametro costruttore solo se è attributo xml (gli elementi come parametri costruttore non sono supportati) * non puoi scrivere direttamente nei campi privati ​​ quindi se hai dominio implementato nell'approccio DDD (no setter e costruttori invece) e inserire le informazioni del negozio xml come elementi, non c'è modo di usare la ruota –

5

JAXB è il modo migliore per convertire oggetti in XML e MOXy è la migliore implementazione di JAXB.

  • JAXB is standard, inclusi in Java SE 6
  • tecnologia vincolante XML standard per JAX-WS, JAX-RS, e SCA
  • runtime semplice

moxy offre le seguenti estensioni:

+0

Voglio andare dall'altra parte da XML a un oggetto. Anche il mio documento XML è molto grande e voglio solo analizzare un piccolo sottoinsieme di dati nei miei oggetti. –

+1

JAXB/MOXy supporta anche XML per un oggetto. Devi solo mappare il contenuto che vuoi che tutto il resto venga ignorato. La mappatura basata su XPath di MOXy ti aiuta a mantenere un modello di oggetti di piccole dimensioni. Vedi http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html –

Problemi correlati