Ich habe eine gigantische QuickBooks SDK .XSD-Schemadatei, die XML-Anforderungen / -Antworten definiert, die ich von QuickBooks senden / empfangen kann.
Ich möchte in der Lage sein, auf einfache Weise Java-Klassen aus diesen .XSD-Dateien zu generieren, mit denen ich XML in Java-Objekte und Java-Objekte in XML umwandeln kann.
Gibt es eine einfache Möglichkeit, dies zu tun ...?
Im Idealfall wären zur Laufzeit keine Bibliotheken außerhalb der Java-Basisdistribution erforderlich. Aber ich bin flexibel ...
Antworten:
JAXB macht genau das, was Sie wollen. Es ist ab 1.6 in das JRE / JDK integriert
quelle
Um die obigen Kommentare zu "JAXB verwenden" zu erweitern,
In Windows
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
z.B,
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Warten Sie ein bisschen, und wenn Sie eine wohlgeformte XSD-Datei hatten, erhalten Sie einige wohlgeformte Java-Klassen
quelle
Wenn Sie Java in XML und XML in Java in weniger als 5 Minuten codieren möchten, versuchen Sie es mit Simple XML Serialization. Verbringen Sie keine Stunden damit, die JAXB-API http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php zu lernen
Wenn Sie jedoch wirklich JAXB lernen möchten, finden Sie hier ein hervorragendes Tutorial http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Inhalt des Tutorials:
JAXB für die einfache Java-XML-Serialisierung
Es gibt verschiedene Möglichkeiten, XML-Serialisierung in Java durchzuführen. Wenn Sie eine genauere Kontrolle über das Parsen und die Serialisierung wünschen, können Sie sich für eine bessere Leistung für SAX, DOM oder Stax entscheiden. Was ich jedoch oft tun möchte, ist eine einfache Zuordnung zwischen POJOs und XML. Das Erstellen von Java-Klassen für die manuelle Analyse von XML-Ereignissen ist jedoch nicht trivial. Ich habe kürzlich festgestellt, dass JAXB eine schnelle und bequeme Java-XML-Zuordnung oder -Serialisierung ist.
JAXB enthält viele nützliche Funktionen. Die Referenzimplementierung finden Sie hier. Kohsukes Blog ist auch eine gute Quelle, um mehr über JAXB zu erfahren. In diesem Blogeintrag zeige ich Ihnen, wie Sie mit JAXB eine einfache Java-XML-Serialisierung durchführen.
POJO zu XML
Angenommen, ich habe ein Item-Java-Objekt. Ich möchte ein Item-Objekt im XML-Format serialisieren. Was ich zuerst tun muss, ist, dieses POJO mit ein paar XML-Anmerkungen aus dem Paket javax.xml.bind.annotation. * Zu versehen. Siehe Codeliste 1 für Item.java
Aus dem Code
@XmlRootElement(name="Item")
zeigt an, dass ich das Wurzelelement sein möchte.@XmlType(propOrder = {"name", "price"})
Gibt die Reihenfolge an, in der das Element in der XML-Ausgabe angeordnet werden soll.@XmlAttribute(name="id", ...)
Gibt an, dass id ein Attribut für das Stammelement ist.@XmlElement(....)
gibt an, dass Preis und Name Element innerhalb von Artikel sein sollen.Mein
Item.java
ist bereit. Ich kann dann ein JAXB-Skript für das Marshalling von Item erstellen.Eine vollständige Codeliste finden Sie unter Codeliste 2
main.java
. Die Ausgabecode Listing 3-item.xml
Datei wird erstellt. Es sieht aus wie das:Einfach richtig? Sie können das Ausgabe-XML alternativ als Textzeichenfolge, Stream, Writer, ContentHandler usw. kanalisieren, indem Sie einfach den Parameter der Marshal-Methode (...) wie ändern
XML zu POJO
Lassen Sie uns den Prozess umkehren. Angenommen, ich habe jetzt ein Stück XML-Zeichenfolgendaten und möchte es in ein Item.java-Objekt umwandeln. XML-Daten (Codeauflistung 3) sehen aus wie
Ich kann dann diesen XML-Code für das Item-Objekt von dem Marshall entfernen
Eine vollständige Codeliste finden Sie in Codeliste 2 (main.java). Die XML-Quelle kann in vielen Formen sowohl aus Stream als auch aus Datei vorliegen. Der einzige Unterschied ist wiederum der Methodenparameter:
Validierung mit XML-Schema
Das Letzte, was ich hier erwähnen möchte, ist die Überprüfung der Eingabe-XML mit dem Schema, bevor die Bereitstellung für das Java-Objekt aufgehoben wird. Ich erstelle eine XML-Schemadatei mit dem Namen item.xsd. Eine vollständige Codeliste finden Sie in Codeliste 4 (Item.xsd). Jetzt muss ich dieses Schema zur Validierung registrieren.
Wenn ich versuche, XML-Daten für POJO zu entmarschieren, wird eine Ausnahme abgefangen, wenn die Eingabe-XML nicht dem Schema entspricht. Eine vollständige Codeliste finden Sie in Codeliste 5 (invalid_item.xml).
Hier ändere ich das Attribut 'id' in string anstelle von integer.
Wenn die XML-Eingabe für das Schema gültig ist, werden die XML-Daten erfolgreich für das Item.java-Objekt freigegeben.
quelle
Verwenden der Eclipse-IDE: -
quelle
Am einfachsten ist die Verwendung der Befehlszeile. Geben Sie einfach das Verzeichnis Ihrer .xsd-Datei ein:
Der Java generiert also alle Pojos.
quelle
Maven kann für diesen Zweck verwendet werden. Sie müssen einige Abhängigkeiten hinzufügen und nur Ihre Anwendung bereinigen. Sie erhalten alle Klassen automatisch in Ihrem Zielordner erstellt.
Kopieren Sie sie einfach vom Ziel an den gewünschten Ort. Hier ist die Datei pom.xml, mit der ich aus xsd-Dateien klassifizierte Dateien erstellt habe:
Platzieren Sie einfach Ihre xsd-Dateien unter "src / main / webapp / schemas /" und maven findet sie beim Kompilieren.
Ich hoffe, dies wird Ihnen helfen. Weitere Informationen finden Sie unter http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Hoffe es wird helfen :)
quelle
No XSD files found. Please check your plugin configuration.
XMLBeans wird es tun. Insbesondere der Befehl "scomp".
EDIT: XMLBeans wurde zurückgezogen , überprüfen Sie diese Stackoverflow Post für weitere Informationen.
quelle
Nun, die beste Option ist
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.Ich habe auch eine Frage, ob wir hier die Möglichkeit haben, Reverse Engineering durchzuführen. Wenn ja, können wir xsd aus der Pojo-Klasse generieren?
quelle
Wenn es Ihnen nichts ausmacht, eine externe Bibliothek zu verwenden, habe ich in der Vergangenheit Castor verwendet , um dies zu tun.
quelle
JAXB-Einschränkung.
Ich habe an JAXB gearbeitet, meiner Meinung nach ist es eine gute Möglichkeit, mit Daten zwischen XML- und Java-Objekten umzugehen. Die positiven Seiten haben sich bewährt und sind in Bezug auf Leistung und Kontrolle über die Daten zur Laufzeit besser. Mit einer guten Verwendung von erstellten Tools oder Skripten wird viel Codierungsaufwand wegfallen.
Ich fand, dass der Konfigurationsteil keine sofortige Aufgabe ist, und verbrachte Stunden damit, die Entwicklungsumgebung einzurichten.
Ich habe diese Lösung jedoch aufgrund einer dummen Einschränkung fallen lassen, mit der ich konfrontiert war. Meine XML-Schemadefinition (XSD) hat ein Attribut / Element mit dem Namen "Wert" und ich muss XSD so verwenden, wie es ist. Diese sehr kleine Einschränkung erzwang, dass mein Bindungsschritt XJC mit einem Fehler "Eigenschaft 'Wert' wurde bereits verwendet" fehlschlug.
Dies liegt an der JAXB-Implementierung. Der Bindungsprozess versucht, Java-Objekte aus XSD zu erstellen, indem jeder Klasse wenige Attribute hinzugefügt werden, von denen eines ein Wertattribut ist. Bei der Verarbeitung meiner XSD wurde beanstandet, dass bereits eine Eigenschaft mit diesem Namen vorhanden ist.
quelle
Ist JAXBs XJC nicht eine mögliche Antwort darauf? Ich versuche das Gleiche zu erreichen. Immer noch in der "Versuchs" -Phase. Kam über XJC und dachte an das Teilen.
quelle
Der bekannte JAXB
Es gibt ein Maven-Plugin , das dies in jeder gewünschten Build-Phase für Sie erledigen kann.
Sie können dies auf beide Arten tun: xsd <-> Java
quelle
In Bezug auf die JAXB-Einschränkung besteht eine Lösung bei gleichem Namen für verschiedene Attribute darin, der xsd Inline-Jaxb-Anpassungen hinzuzufügen:
+
. . verbindliche Erklärungen. .
oder externe Anpassungen ...
Weitere Informationen finden Sie unter: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
quelle