2008-10-15 20 views
19

Cosa si utilizza per il collegamento XML a Java? JAXB, Castor e XMLBeans sono alcune delle scelte disponibili. I confronti che ho visto sono tutti tre o quattro anni. Sono aperto ad altri suggerimenti. Prestazioni di marshalling/unmarshalling e facilità d'uso sono di particolare interesse.Java XML Binding

Chiarimento: mi piacerebbe vedere non solo quale framework si utilizza, ma il tuo ragionamento per l'utilizzo uno rispetto agli altri.

risposta

8

JiBX. Precedentemente ho usato Castor XML, ma JiBX si è dimostrato decisamente migliore, in particolare in termini di prestazioni (una porta diretta di alcuni codici applicativi da Castor XML a JiBX lo ha reso 9 volte più veloce). Ho anche trovato il formato di mappatura per JiBX per essere più elegante di Castor.

JiBX raggiunge le sue prestazioni utilizzando la manipolazione del bytecode post-compilazione piuttosto che l'approccio di riflessione adottato da Castor. Questo ha il vantaggio che pone meno richieste sul modo in cui si scrivono le classi mappate. Non c'è bisogno di getter, setter e costruttori no-arg solo per soddisfare gli strumenti. La maggior parte delle volte è possibile scrivere la classe senza considerare i problemi di mappatura e quindi mapparla senza modifiche.

+0

+1 per JiBX. Il grande vantaggio che vedo è il modo in cui JiBX sembra essere usato. Sebbene la generazione del codice sia un'opzione, sembra esserci molta enfasi sulla scrittura di proprie mappature per il proprio modello di dati. Tutto ciò che mi impedisce di occuparmi di classi generate mi rende felice. Ho usato JiBX per alcuni anni e l'ho adorato. Non posso dire lo stesso per Castor. :) – spaaarky21

0

Utilizziamo Castore. Si adatta alle nostre esigenze abbastanza bene.

3

Utilizziamo xstream. Marshalling/Unmarshalling è banale. Vedi i loro tutorial per gli esempi.

+0

Wow, sembra molto carino! –

+0

Xstream è una tecnologia di serializzazione xml, non una tecnologia vincolante. – johnstok

+0

Sì, la differenza tra serializzazione e associazione è importante. – erickson

2

Jibx è ciò che viene utilizzato da queste parti. È molto veloce, ma i vincoli possono essere un po 'complicati. Tuttavia, è particolarmente utile se hai schemi XML che descrivono i tuoi oggetti di dominio, dato che si adatta perfettamente a XSD (c'è anche uno strumento beta XSD2Jibx che può prendere XSD e creare classi e mappature di domini stub, che puoi quindi prendere e persuadere a adatta il tuo modello di dominio esistente).

Manipola il codice byte, quindi deve essere eseguito dopo la compilazione iniziale dei file .class di Java. Puoi usare il plugin Maven per questo, o semplicemente usarlo direttamente (il plugin Eclipse non sembra funzionare per me).

2

Ho usato Jaxb con successo variabile. All'epoca (un paio di anni fa) la documentazione complessiva era scarsa e la documentazione di base sull'utilizzo (incluso il punto in cui scaricare le implementazioni) era difficile da trovare o variare.

Il parser che ha scritto le classi Java era abbastanza buono con poca discrepanza rispetto all'XSD originale (anche se penso che abbia avuto problemi a supportare elementi XML astratti).

Non l'ho usato da allora, ma ho un progetto imminente che richiederà proprio tale framework e sarò interessato a sapere come qualcun altro fairs con quanto sopra.

+0

Sembra avere un numero di link validi qui: http: // stackoverflow.it/questions/35785/xml-serialization-in-java –

+0

Dai un'occhiata al mio blog per gli esempi JAXB: http://bdoughan.blogspot.com –

1

Ho usato il castor 7 anni fa - ha funzionato abbastanza bene. DTD usati. Non ci sono molte scelte in quel momento.

In progetti in corso, ho usato
1) JAXB - standard basati, implementazione di riferimento a disposizione, linea di comando e strumenti di formica disponibili. ultima versione - 2.1.8 richiede java 5+.
2) XStream - per Soap Unmarshalling - ha bisogno di Java 5+. Non è veloce e conforme agli standard di JAXB.

BR,
~ Un

12

Se si desidera prendere una decisione informata è necessario essere chiari il motivo per cui si sta traducendo tra XML e oggetti java.La ragione è che le diverse tecnologie in questo spazio cercano di risolvere diversi problemi. I diversi strumenti si dividono in due categorie:

  1. Associazione dati XML: si riferisce al processo di rappresentazione delle informazioni in un documento XML come un oggetto nella memoria del computer. In genere, ciò significa definire un XSD e generare un codice sorgente java equivalente. L'interoperabilità tra lingue diverse è la priorità assoluta (da qui l'uso di XSD), in genere per l'implementazione di servizi Web basati su SOAP.
  2. Serializzazione XML: si riferisce alla scrittura di un grafico di oggetti di memoria in un flusso, in modo che possa essere ricostituito da qualche parte o in un altro momento. Scrivi le classi java a mano; la rappresentazione xml ha un'importanza secondaria. Inoltre, la necessità di prestazioni è spesso maggiore e la necessità di interoperabilità con altri linguaggi come .net è spesso inferiore.

Per la serializzazione xml, Xstream è difficile da battere. JAXB è lo standard per il binding XML.

In entrambi i casi, se si utilizza J2EE è necessario prestare particolare attenzione alle classi richiamate da JPA poiché i proxy di classe e i tipi di raccolta specifici di persistenza possono confondere gli strumenti di associazione/serializzazione.

+0

Grazie per l'input. Sto cercando una soluzione vincolante. Questo è per un servizio web RESTful con un XSD esistente. Abbiamo usato Castor per un certo numero di anni. Mi piacerebbe sapere le ragioni per cui JAXB (o qualsiasi altra cosa) è migliore/peggiore. –

+0

Se hai familiarità con XStream almeno, ti dispiacerebbe controllare la mia domanda su XMLDecoder contro XStream? http://stackoverflow.com/questions/96059/what-are-the-relative-advantages-of-xmlencoder-and-xstream – erickson

4

Se si dispone di un XSD per XML e non è necessario associare i dati a un set esistente di classi, mi piace molto lo XMLBeans. In pratica, funziona così:

  • Compile XSD
  • Usa generato classi Java per leggere i documenti/scrittura conformi a questo schema

Binding un documento XML alle classi generate è semplice come:

EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile); 
1

XmlBeans è una buona scelta specialmente se si hanno file XSD/WSDL 'corrotti'.

Don menzionato

EmployeesDocument empDoc = EmployeesDocument.Factory.parse (xmlFile);

.. ma può anche assumere un nodo, un file o qualsiasi altra fonte.

Nessun combattimento con spazi dei nomi, attraversare l'oggetto che si desidera rimuovere, e Factory.parse esso.

Vorrei averlo trovato 2 settimane fa.

Problemi correlati