2009-04-10 5 views
38

Ich frage mich, was die beste oder am weitesten verbreitete API sind ein Java-Objekt in XML zu konvertieren. Ich bin ziemlich neu in diesem Thema. Gibt es eine Art von API-Aufruf, den Sie vornehmen können, um ein Objekt zu übergeben und XML zurückzugeben? Oder ist es viel mühsamer, wenn Sie das Dokument manuell konstruieren müssen, indem Sie Objektwerte herausziehen?Was ist der beste Weg, um ein Java-Objekt in xml konvertieren mit Open-Source-Apis

Ich habe über Xerces, Sax und Jaxb gelesen. Ich möchte diese Open-Source-Route fortsetzen.

Danke!

Antwort

53

JAXB ist definitiv die Lösung.

Warum? Nun, es ist innerhalb des JDK 6, so dass Sie es nie unbeaufsichtigt finden werden.

Es verwendet Java-Annotationen, um XML-bezogene Eigenschaften für Klassen, Methoden und Felder zu deklarieren.

Tutorial 1

Tutorial 2

Hinweis: JAXB können Sie auch leicht zu 'Abstellungs' XML-Daten zurück (die zuvor von Java-Objekt-Instanzen vermarshallten wurde) Instanzen zu widersprechen.

Noch eine große Sache über JAXB wird: Es wird von anderen Java-bezogenen Technologien wie JAX-RS (eine Java RESTful API, die als Teil Java EE 6 availible ist) unterstützt. JAX-RS kann JAXB Objekte on the fly bedienen und empfangen, ohne dass es erforderlich ist, sie zu Marshalling/Unmarshalling zu senden. Sie möchten vielleicht Netbeans auschecken, die Out-of-the-Box-Unterstützung für JAX-RS enthält. Lesen Sie this tutorial für den Einstieg.

edit:

Um marshall/unmarshall 'zufällig' (oder fremde) Java-Objekte, JAXB bietet recht einfache Möglichkeit: Man kann ein XMLAdapter und 'wrap' bestehende Java-Klassen erklärt zu sein JAXB-kompatibel. Die Verwendung eines solchen XmlAdapter erfolgt mit dem @ XmlJavaTypeAdapter -annotation.

+1

Dieses Paket scheint darauf ausgerichtet zu sein, eine vorhandene XML-Datei in Java-Code zu mappen, anstatt eine schnelle und schmutzige Persistenz von "zufälligen" Java-Objekten. ... das ist eine nützliche Sache zu tun, aber nicht ganz, was gefragt wurde, denke ich. – Roboprog

+0

Bitte beachten Sie den Abschnitt Bearbeiten meiner Antwort –

+1

JAXB ist für die Bindung, nicht Serialisierung. Verwenden Sie java.beans.XMLEncoder für die einfache Serialisierung. – erickson

18

Sie könnten XStream aussehen wollen: http://x-stream.github.io

+1

Ich habe das verwendet, um Objekte als XML zu schreiben/zu lesen. Es funktioniert, und es ist nicht schwer. – Roboprog

+2

Check out: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

+1

@BlaiseDoughan ausgezeichneter Artikel. – James

1

XMLBeans ist eine andere, ähnlich wie JAXB. Ich habe JAXB eine Weile nicht angeschaut, als ich es tat, war es ziemlich schlecht im Vergleich zu XMLBeans, aber das war vor Jahren (und ich bevorzuge Dinge, die im JDK sind, im Gegensatz zu denen von Drittanbietern, aber ich benutze immer noch XMLBeans bis heute).

1

In diesem Bereich gibt es viele Open-Source-Frameworks. Allerdings ist Simple, wie der Name schon sagt, bei weitem der einfachste Weg, Serialisierung durchzuführen. Werfen Sie einen Blick auf die Tutorial. Ein weiteres Merkmal ist, dass es eine polymorphe Serialisierung durchführen kann, was bedeutet, dass es nicht so eingeschränkt ist wie beispielsweise JAXB.

4

Verfügbar mit Java 6 ist eine API zum Konvertieren von annotierten Java-Objekten in XML. Der folgende Code zeigt, wie man XML-String

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type()); 

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); 

// Do this if you want the result to be more human readable. 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
m.marshal(o, System.out);

Sie können eine kommentierte Objekt konvertieren dies weiter verlängern, indem Schema-Validierung Hinzufügen (beachten Sie sehr langsam, aber nützlich für das Debuggen)

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type()); 

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); 
final Schema schema = SchemaFactory.newInstance(
    "http://www.w3.org/2001/XMLSchema").newSchema(
    getClass().getResource("/META-INF/wsdl/schema.xsd")); 
m.setSchema(schema); 
m.marshal(o, System.out);

Sie don‘ t muss eine Typkonvertierung zu JAXBElement erfolgen, wenn Type ein definiertes Element ist. (d. h. hat eine Anmerkung @XmlRootElement)

3

Für alle, die sich für die Verwendung von JAXB entscheiden, stellen Sie sicher, dass Sie JAXBContext zwischenspeichern. JAXBContext.newInstance ist bekanntlich sehr teuer. Ich habe einen Fall dokumentiert, in dem die Konvertierung in XML bei der Protokollierung verwendet wird und JAXBContext.newInstance nicht zwischengespeichert wird. Es verursachte einen Leistungs-Overhead von bis zu 5 Sekunden, wenn 20 gleichzeitige Benutzer darauf zugreifen.

http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

Dies ist nicht, dass jemand mit JAXB zu entmutigen. Sobald JAXBContext zwischengespeichert ist, ist die Leistung ausgezeichnet, wie im obigen Link beschrieben.