2008-10-15 12 views
19

Was verwenden Sie zum Binden von XML an Java? JAXB, Castor und XMLBeans sind einige der verfügbaren Optionen. Die Vergleiche, die ich gesehen habe, sind alle drei oder vier Jahre alt. Ich bin offen für andere Vorschläge. Die Marshalling-/Unmarshalling-Leistung und die Benutzerfreundlichkeit sind von besonderem Interesse.Java-XML-Bindung

Klarstellung: Ich würde gerne sehen, nicht nur, welches Framework Sie verwenden, sondern Ihre Argumentation für die Verwendung eines über die anderen.

Antwort

8

JiBX. Zuvor habe ich Castor XML verwendet, aber JiBX erwies sich als deutlich besser, insbesondere in Bezug auf die Leistung (ein direkter Port einiger Anwendungscode von Castor XML zu JiBX machte es 9x schneller). Ich fand auch, dass das Mapping-Format für JiBX eleganter ist als das von Castor.

JiBX erreicht seine Leistung, indem es die Bytecode-Manipulation nach der Kompilierung anstelle des von Castor angewendeten Reflektionsansatzes verwendet. Dies hat den Vorteil, dass weniger Anforderungen an das Schreiben der zugeordneten Klassen gestellt werden. Es gibt keine Notwendigkeit für Getter, Setter und Nicht-Arg-Konstruktoren, nur um die Werkzeuge zu erfüllen. In den meisten Fällen können Sie die Klasse schreiben, ohne Mapping-Probleme zu berücksichtigen, und sie dann ohne Änderungen zuordnen.

+0

+1 für JiBX. Der große Vorteil, den ich sehe, ist die Art und Weise, wie JiBX benutzt wird. Obwohl die Codegenerierung eine Option ist, scheint es sehr wichtig zu sein, eigene Zuordnungen für Ihr eigenes Datenmodell zu schreiben. Alles, was mich davon abhält, mit generierten Klassen umzugehen, macht mich glücklich. Ich benutzte JiBX für ein paar Jahre und liebte es. Das kann ich für Castor nicht sagen. :) – spaaarky21

0

Wir verwenden Castor. Es entspricht unseren Bedürfnissen ziemlich gut.

3

Wir verwenden xstream. Marshalling/Unmarshalling ist trivial. Sehen Sie ihre tutorial für Beispiele.

+0

Wow, das sieht ziemlich glatt aus! –

+0

Xstream ist eine XML-Serialisierungstechnologie, keine verbindliche Technologie. – johnstok

+0

Ja, der Unterschied zwischen Serialisierung und Bindung ist wichtig. – erickson

2

Jibx ist, was hier verwendet wird. Es ist sehr schnell, aber die Bindungen können ein wenig schwierig sein. Es ist jedoch besonders nützlich, wenn Sie XML-Schemas haben, die Ihre Domänenobjekte beschreiben, da es wirklich gut zu XSD passt (es gibt sogar ein Beta-Tool XSD2Jibx, das XSDs verwenden und Stubdomänenklassen und -zuordnungen erstellen kann, die Sie dann übernehmen und ansprechen können) passen Sie Ihr vorhandenes Domänenmodell an).

Es manipuliert Bytecode, also muss es nach der ersten Kompilierung der Java .class-Dateien ausgeführt werden. Sie können dafür das Maven-Plugin verwenden oder es direkt verwenden (das Eclipse-Plugin schien bei mir nicht zu funktionieren).

2

Ich habe Jaxb mit unterschiedlichem Erfolg verwendet. Zu der Zeit (vor ein paar Jahren zurück) war die gesamte Dokumentation glanzlos und die grundlegende Nutzungsdokumentation (einschließlich wo man Implementierungen herunterladen kann) war schwierig zu finden oder zu variieren.

Der Parser, der die Java-Klassen geschrieben hat, war ziemlich gut mit wenig Diskrepanz gegenüber der ursprünglichen XSD (obwohl ich denke, dass es Probleme bei der Unterstützung abstrakter XML-Elemente hatte).

Ich habe es seit dem nicht verwendet, aber ich habe ein bevorstehendes Projekt, das genau solch ein Framework erfordern wird und ich werde interessiert sein, wie jemand andere Messen mit dem oben genannten.

+0

Scheint eine Reihe von guten Links hier zu haben: http: // stackoverflow.com/questions/35785/xml-serialisierung-in-java –

+0

Schauen Sie sich mein Blog für JAXB Beispiele: http://bdoughan.blogspot.com –

1

Ich benutzte Castor vor 7 Jahren - es funktionierte ziemlich gut. verwendete DTDs. Nicht viele Möglichkeiten zu dieser Zeit.

In aktuellen Projekten habe ich
1) JAXB - Standards basiert, Referenzimplementierung verfügbar, Befehlszeile und Ant-Tools zur Verfügung. neueste Version - 2.1.8 benötigt Java 5+.
2) XStream - für Soaps unmarshalling - benötigt Java 5+. Ist nicht so schnell und standardkonform wie JAXB.

BR,
~ A

12

Wenn Sie eine fundierte Entscheidung treffen möchten, müssen Sie klar sein, warum Sie zwischen XML- und Java-Objekten übersetzen.Der Grund dafür ist, dass die verschiedenen Technologien in diesem Raum versuchen, verschiedene Probleme zu lösen. Die verschiedenen Werkzeuge lassen sich in zwei Kategorien einteilen:

  • XML-Datenbindung - bezieht sich auf den Prozess der Darstellung der Informationen in einem XML-Dokument als Objekt im Computerspeicher. Normalerweise bedeutet dies, dass ein XSD definiert und ein Java-Quellcode-Äquivalent erzeugt wird. Interop zwischen verschiedenen Sprachen hat oberste Priorität (daher die Verwendung von XSD) - am typischsten für die Implementierung von SOAP-basierten Web-Services.
  • XML-Serialisierung - bezieht sich auf das Schreiben eines Diagramms von Speicherobjekten in einen Stream, so dass es irgendwo oder irgendwann wiederhergestellt werden kann. Sie schreiben die Java-Klassen von Hand; Die XML-Repräsentation ist von untergeordneter Bedeutung. Außerdem ist der Leistungsbedarf oft größer und die Notwendigkeit der Zusammenarbeit mit anderen Sprachen wie .net ist oft geringer.
  • Für Xml-Serialisierung ist Xstream schwer zu schlagen. JAXB ist der Standard für die XML-Bindung.

    In jedem Fall müssen Sie, wenn Sie J2EE verwenden, sorgfältig auf Klassen achten, die von JPA abgerufen werden, da Klassenproxies und persistenzspezifische Auflistungstypen die Bindungs-/Serialisierungstools verwechseln können.

    +0

    Danke für Ihre Eingabe. Ich bin auf der Suche nach einer verbindlichen Lösung. Dies ist für einen REST-fähigen Web-Service mit einer vorhandenen XSD. Wir verwenden Castor seit einigen Jahren. Ich würde gerne wissen, warum JAXB (oder was auch immer) besser/schlechter ist. –

    +0

    Wenn Sie zumindest mit XStream vertraut sind, würde es Ihnen etwas ausmachen, meine Frage zu XMLDecoder und XStream zu lesen? http://StackOverflow.com/Questions/96059/what-are-the-relative-Advantages-of-xmllencoder-and-xstream – erickson

    4

    Wenn Sie eine XSD für die XML haben, und Sie die Daten nicht an eine vorhandene Gruppe von Klassen binden müssen, dann mag ich XMLBeans. Grundsätzlich funktioniert es wie folgt aus:

    • Compile XSD
    • Verwendung generierten Java-Klassen/Schreib-Dokumente zu lesen, um dieses Schema konform

    Bindung ein XML-Dokument zu den generierten Klassen ist so einfach wie:

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

    XmlBeans ist eine gute Wahl, besonders wenn Sie XSD/WSDL-Dateien "gebrochen" haben.

    Don

    erwähnt

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

    ..aber es kann auch einen Knoten oder eine Datei oder nur über jede Quelle nehmen.

    Kein Kampf mit Namespaces, Traverse auf das Objekt, das Sie unmarshall, und Factory.parse es.

    Ich wünschte, ich hätte es vor 2 Wochen gefunden.