Mit JAXB-Schemagen-Tools eine XML-Schemadatei aus einer Java-Klasse generieren
Verwenden Sie die JAXB-Schemagen-Tools (Java™ Architecture for XML Binding), um eine XML-Schemadatei aus Java-Klassen zu erstellen.
Vorbereitungen
Informationen zu dieser Task
Verwenden Sie JAXB-APIs und -Tools, um Zuordnungen zwischen Java-Klassen und XML-Schema herzustellen. In XML-Schemadokumenten werden die Datenelemente und Beziehungen in einem XML-Dokument beschrieben. Wenn eine Datenzuordnung oder -bindung vorhanden ist, können Sie XML-Dokumente in Java-Objekte und umgekehrt konvertieren. Anschließend können Sie auf die in einem XML-Dokument gespeicherten Daten zugreifen, ohne die Datenstruktur verstehen zu müssen.
Wenn Sie Web-Services mit einem Bottom-up-Entwicklungsansatz aus vorhandenen JavaBeans oder Enterprise-Beans entwickeln möchten, verwenden Sie das Tool wsgen , um die Artefakte für JAX-WS-Anwendungen (Java API for XML-Based Web Services) zu generieren. Nachdem die Java-Artefakte für Ihre Anwendung generiert wurden, können Sie mit dem JAXB-Schemagenerator, dem Befehlszeilentool schemagen , ein XML-Schemadokument aus einer vorhandenen Java-Anwendung erstellen, die die Datenelemente einer Java-Anwendung darstellt. Der JAXB-Schemagenerator verarbeitet entweder Java-Quellendateien oder Klassendateien. Annotationen für Java-Klassen bieten die Möglichkeit, die Standardzuordnungen von vorhandenen Java-Klassen zu den generierten Schemakomponenten anzupassen. Die XML-Schemadatei und die annotierten Java-Klassendateien enthalten alle erforderlichen Informationen, die die JAXB-Laufzeit benötigt, um die XML-Dokumente für das Marshaling und Unmarshaling syntaktisch zu analysieren.
Sie können ein XML-Schemadokument aus einer vorhandenen Java-Anwendung erstellen, die die Datenelemente einer Java-Anwendung darstellt, indem Sie das Befehlszeilentool schemagen des JAXB-Schemagenerators verwenden. Der JAXB-Schemagenerator verarbeitet entweder Java-Quellendateien oder Klassendateien. Annotationen für Java-Klassen bieten die Möglichkeit, die Standardzuordnungen von vorhandenen Java-Klassen zu den generierten Schemakomponenten anzupassen. Die XML-Schemadatei und die annotierten Java-Klassendateien enthalten alle erforderlichen Informationen, die die JAXB-Laufzeit benötigt, um die XML-Dokumente für das Marshaling und Unmarshaling syntaktisch zu analysieren.
JAXB vorgenommenen bietet Kompilierungsunterstützung, um Ihnen zu ermöglichen, den Schemagenerator schemagen so zu konfigurieren, dass er nicht automatisch ein neues Schema generiert. Diese Verbesserung ist nützlich, wenn Sie ein einheitliches Schema wie World Wide Web Consortium (W3C), XML Schema, Web Services Description Language (WSDL) oder WS-Addressing verwenden und kein neues Schema für ein bestimmtes referenziertes Paket generiert werden soll. Das Attribut location in der Annotation "@XmlSchema" bewirkt, dass der Generator "schemagen" auf den URI des vorhandenen Schemas verweist, anstatt ein neues Schema zu generieren.
Sie können das JAXB-Tool schemagen nicht nur über die Befehlszeile aufrufen, sondern auch in Ant-Build-Umgebungen. Verwenden Sie die Ant-Task com.sun.tools.jxc.SchemaGenTask in der Ant-Build-Umgebung, um das Schemageneratortool schemagen aufzurufen. Damit diese Ant-Task richtig ausgeführt wird, müssen Sie Ant mit dem Script "ws_ant" aufrufen.
- Stellen Sie eine Datei "package-info.java" mit der Annotation "@XmlSchema" bereit, z. B.:
schemagen sample.Address sample\package-info.java - Verwenden Sie das Attribut "namespace" der Annotation "@XmlType" an, um einen Namespace anzugeben, z. B.:
@XmlType(namespace="http://myNameSpace")
Vorgehensweise
Ergebnisse
Nachdem Sie nun eine XML-Schemadatei aus Java-Klassen generiert haben, können Sie das Marshaling und Unmarshaling der Java-Objekte als XML-Instanzdokumente ausführen.
Error: Two classes have the same XML type name .... Use @XmlType.name and @XmlType.namespace to assign different names to them...Dieser Fehler gibt an, dass Sie Klassennamen oder @XMLType.name -Werte haben, die denselben Namen haben, aber in verschiedenen Java-Paketen vorhanden sind. Fügen Sie zur Vermeidung dieses Fehlers die Klasse "@XML.Type.namespace" zur vorhandenen Annotation "@XMLType" hinzu, um die Unterscheidung zwischen den XML-Typen zu ermöglichen.
Beispiel
- Kopieren Sie die folgende Datei
Bookdata.javain ein temporäres Verzeichnis.package generated; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; import javax.xml.datatype.XMLGregorianCalendar; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "bookdata", propOrder = { "author", "title", "genre", "price", "publishDate", "description" }) public class Bookdata { @XmlElement(required = true) protected String author; @XmlElement(required = true) protected String title; @XmlElement(required = true) protected String genre; protected float price; @XmlElement(name = "publish_date", required = true) protected XMLGregorianCalendar publishDate; @XmlElement(required = true) protected String description; @XmlAttribute protected String id; public String getAuthor() { return author; } public void setAuthor(String value) { this.author = value; } public String getTitle() { return title; } public void setTitle(String value) { this.title = value; } public String getGenre() { return genre; } public void setGenre(String value) { this.genre = value; } public float getPrice() { return price; } public void setPrice(float value) { this.price = value; } public XMLGregorianCalendar getPublishDate() { return publishDate; } public void setPublishDate(XMLGregorianCalendar value) { this.publishDate = value; } public String getDescription() { return description; } public void setDescription(String value) { this.description = value; } public String getId() { return id; } public void setId(String value) { this.id = value; } } - Öffnen Sie eine Eingabeaufforderung.
- Führen Sie das Schemageneratortool "schemagen" in dem Verzeichnis aus, in das Sie die Datei
Bookdata.javakopiert haben.app_server_root\bin\schemagen.bat Bookdata.java
app_server_root/bin/schemagen.sh Bookdata.java
app_server_root/bin/schemagen Bookdata.java
- Die XML-Schemadatei
schema1.xsdwird generiert:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="bookdata"> <xs:sequence> <xs:element name="author" type="xs:string"/> <xs:element name="title" type="xs:string"/> <xs:element name="genre" type="xs:string"/> <xs:element name="price" type="xs:float"/> <xs:element name="publish_date" type="xs:anySimpleType"/> <xs:element name="description" type="xs:string"/> </xs:sequence> <xs:attribute name="id" type="xs:string"/> </xs:complexType> </xs:schema>
Weitere Informationen zum Befehl schemagen finden Sie in der Dokumentation zu einer Referenzimplementierung von JAXB.