XML mit Java OpenSource (c) Mark Egloff 2004 JAXB << Java Architecture for XML Binding >> 1 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB Lernziele • Übersicht JAXB • Prinzip von Data Binding verstehen • Java Klassen aus XSD erzeugen • Java Objekte aus XML marschallen bzw. unmarschallen • Customized Binding 2 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB Was ist JAXB ? JAXB = Java Architecture for XML Binding JAXB ist ein Standard von SUN bezüglich Java Objekte und XML. (java.sun.com/xml/jaxb) JAXB enstand aus dem Java Community Process JSR 31 (ca. 2001) 3 MacroMedia BEA HP BreezeFactor Fujitsu webMethods IBM Intalio Oracle Software AG TIBCO Extensibility XML mit Java OpenSource (c) Mark Egloff 2004 JAXB Eigenschaften von JAXB Bei JAXB werden die Klassen nicht mehr in Java geschrieben. Sie werden entweder mittels XML Schema oder einer DTD beschrieben. Ein Binding Compiler generiert den Java Source Code anhand von XML Schema oder DTD. JAXB bietet ein Framework um Instanzen dieser generierten Klassen in XML zu marschallen und wieder zurück. 4 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Prinzip Prinzip Data Binding bei JAXB Data Data Structures Structures <xsd> <xsd> <!<!DTD DTD>> Binding Compiler Customized Customized Binding Binding <xml> <xml> <xml> <xml> Java Java Source Source Code Code Java Compiler Java Java Byte Byte Code Code Binding Framework JAXB erzeugt anhand XSD Java Source Code. Diese Klassen haben die Binding Funktionen schon eingebettet. 5 Objekte XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Prinzip Prinzip Data Binding bei JAXB 6 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Prinzip Zusammenspiel von Schema und Objekten b. JAXB 7 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Prinzip Warum Klassen durch XSD oder DTD generieren? Mittels XSD lässt sich fast jede beliebige Datenstruktur beschreiben Das Prinzip lässt sich auch auf andere Technologien anwenden und mit Java kombinieren. z.B. Generierung des Datenmodel einer Datenbank DB Data Data Model Model [SQL] [SQL] 8 Binding Framework Data Data Structures Structures <xsd> <xsd> Objekte Java Java ByteCode ByteCode [class] [class] XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Installation JAXB beziehen und installieren: JAXB kann bei SUN bezogen werden. Es wird nur zusammen mit dem Java Webservice Development Pack JWSDP ausgeliefert. java.sun.com/webservices/jwsdp/index.jsp Zurzeit ist das JWSDP ein Package mit eigenem Installer JAXB Konfiguration: Um das JWSDP bzw. JAXB zu nutzen müssen die Home Environment Variablen angelegt werden. set JAVA_HOME=<your J2SE installation directory> 9 set JWSDP_HOME=<your JWSDP 1.4 installation directory> XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Binding Beispiel einfache Klassen „CD Catalog“: public class Catalog { Collection cds; } public class Cd { String title; Sting artist; double price; String country; } Cd Catalog cds 0..* title artist price country Set() und Get() Methoden für wurden wegen die wegen der Übersichtlichkeit weggelassen 10 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Binding Beispiel einfache Klassen „CD Catalog“ in DTD: <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT catalaog (cd*) > cd (title, artist, price) > cd country CDATA #REQUIRED> title (#PCDATA) > artist (#PCDATA) > price (#PCDATA) > Die DTD lässt eine sehr kompakte Schreibweise zu Mittels der DTD können wir Relationen (0..*) oder (1..*) genauer ausdrücken als in Java. 11 Datentype der Klassenattribute sind aber beschränkt, alles wird zu String XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Binding Beispiel einfache Klassen „CD Catalog“ in XSD: 12 <?xml version="1.0" encoding="utf-8" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="catalog"> <xsd:complexType> <xsd:sequence> <xsd:element name="cd" type="Cd" maxOccurs="unbounded" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="Cd"> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="artist" type="xsd:string"/> <xsd:element name="price" type="xsd:double"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:string"/> </xsd:complexType> </xsd:schema> XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Binding Vorteile Beschreibung mittels XSD: Bei XSD ist der Syntax nicht so kompakt Mittels XSD können genauere Relationen definiert werden als mit DTD oder Java XSD lässt genauere Datentypen zu als DTD 13 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Binding Compiler Verwendung des Bindings Compilers: Der Binding Compiler kann entweder mittels ANT oder über das mitgelieferte „xjc.bat“ aufgerufen werden Beispiel Aufruf „xjc.bat“: %JWSDP_HOME%\jaxb\bin\xjc.bat -p my.music –d gen-src cdcatalog.xsd 14 Parameter Beschreibung -p pack.subpack package für die generierten Klassen -d dir Destinations-Verzeichnis, muss existieren xxxx.xsd Pfad zur XML Schema Datei XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Binding Compiler Verwendung des Bindings Compilers: Beispiel Ausgabe: %JWSDP_HOME%\jaxb\bin\xjc.bat -d gen-src -p my.music cdcatalog.xsd parsing a schema... compiling a schema... my\music\impl\CatalogImpl.java my\music\impl\CatalogTypeImpl.java my\music\impl\CdImpl.java my\music\impl\JAXBVersion.java my\music\Catalog.java my\music\CatalogType.java my\music\Cd.java my\music\ObjectFactory.java my\music\bgm.ser 15 my\music\jaxb.properties ca. 40 Dateien werden generiert ! XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Binding Ausgabe des Binding Compilers: JAXB generiert für unsere Objekte jeweils Interfaces, Implementation und Hilfsklassen Wir werden nie direkt die Implementation selber verwenden, sondern nur die Interfaces und Hilfsklassen Catalog CatalogImpl 16 Cd CdImpl ObjectFactory XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Framework Marshalling mit JAXB // create Factory ObjectFactory factory = new ObjectFactory(); // Build Cd Catalog Catalog cat = factory.createCatalog(); Cd cd = factory.createCd(); cd.setCountry("USA"); cd.setPrice(10.90); ... cat.getCd().add(cd); // initialise JAXB JAXBContext jc = JAXBContext.newInstance("my.music"); // create a Marshaller Marshaller m = jc.createMarshaller(); // marshal catalog OutputStream os = new FileOutputStream("cdcatalog.xml"); 17 m.marshal( cat, os ); XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Framework Unmarshalling mit JAXB // initialise JAXB JAXBContext jc = JAXBContext.newInstance("my.music"); // create an Unmarshaller Unmarshaller u = jc.createUnmarshaller(); // unmarshal catalog Catalog cat = (Catalog) u.unmarshal( new FileInputStream("cdcatalog.xml")); // Iterate through CD's Iterator it = cat.getCd().iterator(); while(it.hasNext()) { Cd cd = (Cd) it.next(); System.out.println(cd.getTitle()); } 18 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Framework Validierung bei Marshalling (1/2): Der Marshaller von JAXB unternimmt keine Validierung beim marshallen der Objekte. Dies kann zu einer Verletzung des Schemas führen Beispiel im XSD: <xsd:element name="cd" type="Cd" maxOccurs="unbounded" minOccurs="2"/> Beispiel im Java Code: // Build Cd Catalog with only one CD Catalog cat = factory.createCatalog(); cat.getCd().add(cd); m.marshal( cat, os ); Auswirkungen wären ungültige XML 19 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Framework Validierung bei Marshalling (2/2): JAXB bietet einen Validator um die Objektstruktur gemäss dem Schema zu überprüfen Beispiel im Java Code: // Build Cd Catalog with only one CD Catalog cat = factory.createCatalog(); cat.getCd().add(cd); // Create Validator Validator validator = jc.createValidator(); validator.validate(cat); m.marshal( cat, os ); Ausgabe ist eine Exception da mehr CD‘s erwartet wurden: DefaultValidationEventHandler: [ERROR]: uncompleted content model. expecting: <cd> 20 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding JAXB bietet die Möglichkeit das Binding nach eigenen Wünschen anzupassen. • Abbildung von XML Elementen Æ Java Bean • Package • Vererbung • Methodennamen • Datentypen für Java Bean Attribute Das „Customized Binding“ wird mittels definierten XML Anweisungen beschrieben. Diese Anweisungen können „inline“ im XSD oder als externe Datei realisiert werden. 21 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Beispiel einer externen Binding Definition (1/2): <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"> <jaxb:bindings schemaLocation="cdcatalog.xsd"> <jaxb:bindings node="//xs:complexType[@name='Cd']"> <jaxb:class name="CompactDisc"/> <jaxb:bindings node="//xs:element[@name='title']"> <jaxb:property name="AlbumName"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings> Hier wird ein XML Element auf eine anderen Klassennamen gemappt 22 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Beispiel einer externen Binding Definition (2/2): Generiertes Interfaces nach Aufruf des Binding Compilers interface CompactDisc { public void setAlbumName(String value); public String getAlbumName(); public void setPrice(double value); public double getPrice(); public void setArtist(String value); public String getArtist(); } 23 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Die wichtigsten Customizing Binding Instruktionen sind: <jaxb:bindings> Root Element oder Beginn einer Definition <jaxb:class> Mapping von einem XSD ComplexType auf Klasse <jaxp:property> Mapping von einem Element oder Attribut auf ein Bean Property <jaxb:javaType> Angaben um spezielle Datentypen von/nach String zu konvertieren 24 XML mit Java OpenSource (c) Mark Egloff 2004 Deklaration JAXB – Customized Binding Aufbau eines externen Bindings (1/3): Root schemaLocation bindings node class <jaxb:bindings ... > <jaxb:bindings schemaLocation ... > <jaxb:bindings node="[xpath]"> property <jaxb:xxxx> javaType </jaxb:bindings> bindings node <jaxb:bindings node="[xpath]"/> </jaxb:bindings> schemaLocation 25 <jaxb:bindings schemaLocation ... /> </jaxb:bindings> XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Aufbau eines externen Bindings (2/3): Externe Binding Defintionen beginnen mit dem Root „<jaxb:bindings>“. Der Namespace und die Version ist dabei zwingend <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0"> Danach wird auf das jeweilige Schema mit einem „<jaxb:bindings schemaLocation>“ verwiesen 26 <jaxb:bindings xmlns:jaxb=... > <jaxb:bindings schemaLocation="path.to.Schema.xsd"> ... </jaxb:bindings> </jaxb:bindings> XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Aufbau eines externen Bindings (3/3): Die Binding Definition besteht aus verschiedenen „Mapping“ Instruktionen. Die Beziehung zwischen diesen Instruktionen und dem XSD wird mittels XPath festgelegt. <jaxb:bindings xmlns:jaxb=... > <jaxb:bindings schemaLocation="..."> 27 <jaxb:bindings node="//xsd:complexType[@name='Cd']"> <jaxb:class name="CompactDisc"/> <jaxb:bindings node="//xsd:element[@name='title']"> <jaxb:property name="AlbumName"/> </jaxb:bindings> </jaxb:bindings> ... </jaxb:bindings> XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Aufruf des Binding Compilers bei externem Binding: Die externe Binding Definition wird beim Aufruf des Binding Compilers mit einem separaten Parameter „-b“ angegeben: %JWSDP_HOME%\jaxb\bin\xjc.bat -b cdcatalog.jbx cdcatalog.xsd 28 XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Beispiel einer „inline“ Binding Definition (1/2): <xsd:complexType name="Cd"> <xsd:attribute name="country" type="xs:string"> <xsd:annotation> <xsd:appinfo> <jaxb:property name="ISOCountry"/> </xsd:appinfo> </xsd:annotation> </xsd:attribute> </xsd:complexType> Die Binding Instruktionen werden mittels „<xsd:annotation>“ in das Schema eingebettet 29 Sie werden jeweils für jedes Element separat angegeben XML mit Java OpenSource (c) Mark Egloff 2004 JAXB – Customized Binding Beispiel einer „inline“ Binding Definition (2/2): <xs:complexType name="Cd"> <xs:attribute name="country" type="xs:string"> <xs:annotation> <xs:appinfo> <jaxb:property name="ISOCountry"/> </xs:appinfo> </xs:annotation> public interface Cd </xs:attribute> { </xs:complexType> public void setISOCountry(String c); public String getISOCountry(); } 30 Hier wird ein XML Attribut auf ein bestimmtes Java Bean Property gemappt XML mit Java OpenSource (c) Mark Egloff 2004 JAXB - Links z Sun: JAXB http://java.sun.com/xml/jaxb/ z Sun: Java Web Service Tutorial http://java.sun.com/webservices/docs/1.4/tutorial/doc/ z xml.com: The JAXB API http://www.xml.com/pub/a/2003/01/08/jaxb-api.html z On Java: Understanding JAXB http://www.onjava.com/pub/a/onjava/2003/12/10/jaxb.html z IBM: Data Binding with JAXB http://www-106.ibm.com/developerworks/edu/x-dw-xjaxb-i.html 31