Java API for XML Binding Eine Einführung Tim Speier Fachbereich MNI Fachhochschule Gießen-Friedberg 24. Juni 2010 1 / 27
XM und Java Teil 1: Aufgabenstellung Aufgabenstellung: In einem XML-Dokument werden die Bücher und deren Autoren einer Bibliothek erfasst. Dazu gehören (stark vereinfacht) : Bibliothek Buch Autor Eine in Java programmierte Anwendung soll nun die Datenbank auslesen und den Inhalt darstellen, evtl. modifizieren und wieder als XML-Dokument speichern. Library Book 1..* - title: String - isbn: int 0..* 1..* Author - sn: String - gn: String 2 / 27
XML Auffrischung Dokument (XML) Hierarchisch strukturierte Daten in Textform Besteht aus Deklaration, Elementen, Attributen und Daten Schema (XSD) Beschreibt die Struktur der XML-Dokumente Ist selbst auch ein XML-Dokument Wohlgeformt: Dokument ist gemäß XML aufgebaut Gültig: Dokument folgt einem vorgegebenen Schema 3 / 27
XM und Java Teil 2: XML-Schema 1 <xs: complextype name= Author > 2 <x s : s e q u e n c e> 3 <x s : e l e m e n t name= sn t y p e= x s : s t r i n g /> 4 <x s : e l e m e n t name= gn t y p e= x s : s t r i n g /> 5 </ x s : s e q u e n c e> 6 </ xs: complextype> 7 8 <xs: complextype name= Book > 9 <x s : s e q u e n c e> 10 <x s : e l e m e n t name= a u t h o r s t y p e= Author minoccurs= 1 /> 11 </ x s : s e q u e n c e> 12 <x s : a t t r i b u t e name= t i t l e t y p e= x s : s t r i n g /> 13 <x s : a t t r i b u t e name= i s b n t y p e= x s : l o n g /> 14 </ xs: complextype> 15 16 <x s : e l e m e n t name= L i b r a r y > 17 <xs: complextype> 18 <x s : s e q u e n c e> 19 <x s : e l e m e n t name = books t y p e= Book minoccurs= 0 maxoccurs= unbounded /> 20 </ x s : s e q u e n c e> 21 </ xs: complextype> 22 </ x s : e l e m e n t> 4 / 27
XML und Java Teil 3: XML-Dokument 1 <L i b r a r y> 2 <books> 3 <Book t i t l e = E n t e r p r i s e I n t e g r a t i o n P a t t e r n s i s b n= 0321200683 > 4 <a u t h o r s> 5 <Author><gn>Gregor</ gn><sn>hohpe</ sn></ Author> 6 <Author><gn>Booby</ gn><sn>woolf</ sn></ Author> 7 </ a u t h o r s> 8 </Book> 9 <Book t i t l e = Java SOA Cookbook i s b n= 0321200683 > 10 <a u t h o r s> 11 <Author><gn>Eben</ gn><sn>hewitt</ sn></ Author> 12 </ a u t h o r s> 13 </Book> 14 </ books> 15 </ L i b r a r y> 5 / 27
XML und Java Teil 4: Klassische Anwendung 1. SAX Simple API for XML Sequentielles Lesen des XML-Dokuments Auslösen von Ereignissen wenn ein Element gefunden wird 2. DOM Document Object Model Aufbau der Daten als Baumstruktur im Speicher 3. Weitere StAX Streaming API for XML XPath XML Path Language 6 / 27
XML und Java Teil 5: JAXB-Anwendung 1 L i b a r y l i b =... 2 3 f o r ( Book book : l i b. getbooks ( ) ) { 4 5 S t r i n g t i t l e =book. g e t T i t l e ( ) ; 6 l o n g i s b n=book. g e t I s b n ( ) ; 7 8 System. out. p r i n t l n ( Found book : + t i t l e +i s b n ) ; 9 10 f o r ( Author a u t h o r : book. g e t A u t h o r s ( ) ) { 11 12 S t r i n g sn=a u t h o r. getsn ( ) ; 13 S t r i n g gn=a u t h o r. getgn ( ) ; 14 15 System. out. p r i n t l n ( Author : +a u t h o r ) ; 16 17 } 18 } 7 / 27
Java und XML Analogien XML Schema Java Class follows instance of XML Document Java Object 8 / 27
JAXB Konzeptionell XML Schema compile Java Class Java Class generate follows validate instance of XML Document unmarshall Java Object Java Object marshall 9 / 27
Schema/Klasse Mapping Schema-Compiler Erstellt aus XML-Schemata entsprechende Java-Klassen Schema-Generator Erstellt aus Java-Klassen entsprechende XML-Schemata Aber Achtung: Keine vollständige Abbildung XML Schema compile Java Class Java Class generate 10 / 27
Schema-Compiler: Beispiel 1. XML-Schema Library.xsd (Auszug): 1 <xs: complextype name= Author > 2 <x s : s e q u e n c e> 3 <x s : e l e m e n t name= sn t y p e= x s : s t r i n g /> 4 <x s : e l e m e n t name= gn t y p e= x s : s t r i n g /> 5 </ x s : s e q u e n c e> 6 </ xs: complextype> 2. Aufruf des Compilers: $> xjc Library.xsd 3. Ergebnis (generierte Dateien): Author.java Book.java Library.java ObjectFactory.java 11 / 27
Schema-Compiler: Ergebnis (vereinfacht) 1 p u b l i c c l a s s Author { 2 3 p r o t e c t e d S t r i n g sn ; 4 p r o t e c t e d S t r i n g gn ; 5 6 p u b l i c S t r i n g getsn ( ) { 7 r e t u r n sn ; 8 } 9 10 p u b l i c v o i d s e t S n ( S t r i n g v a l u e ) { 11 t h i s. sn = v a l u e ; 12 } 13 14 p u b l i c S t r i n g getgn ( ) { 15 r e t u r n gn ; 16 } 17 18 p u b l i c v o i d setgn ( S t r i n g v a l u e ) { 19 t h i s. gn = v a l u e ; 20 } 21 22 } 12 / 27
Schema-Compiler: Ergebnis (vereinfacht) 1 p u b l i c c l a s s Book { 2 3 p r o t e c t e d L i s t <Author> a u t h o r s ; 4 p r o t e c t e d S t r i n g t i t l e ; 5 p r o t e c t e d l o n g i s b n ; 6 7 p u b l i c L i s t <Author> g e t A u t h o r s ( ) { 8 i f ( a u t h o r s == n u l l ) { 9 a u t h o r s = new A r r a y L i s t <Author >() ; 10 } 11 r e t u r n t h i s. a u t h o r s ; 12 } 13 14 p u b l i c S t r i n g g e t T i t l e ( ) { 15 r e t u r n t i t l e ; 16 } 17 18 [... ] 19 20 } 13 / 27
Type Mapping Übersicht Java Type boolean byte short int long float double XML Type xs:boolean xs:byte xs:short xs:int xs:long xs:float xs:double Java Class java.lang.string java.math.biginteger java.math.bigdecimal java.util.calendar java.util.date java.lang.object java.util.uuid XML Type xs:string xs:integer xs:decimal xs:datetime xs:datetime xs:anytype xs:string 14 / 27
Schema-Generator: Beispiel 1. Java-Klassen (Sammlung): 1 p u b l i c c l a s s Author { 2 3 p r i v a t e S t r i n g sn ; 4 p r i v a t e S t r i n g gn ; 5 6 // some g e t t e r s and s e t t e r s... 7 [... ] 8 } 2. Aufruf des Generators: $> schemagen Library.java 3. Ergebnis (generierte Datei): schema1.xsd 15 / 27
Type Mapping Annotationen Etwa 30 Annotationen steuern das Mapping (Auszug): XmlSchema XmlRootElement XmlElement XmlElementWrapper XmlAttribute XmlValue XmlType XmlJavaTypeAdapter... 16 / 27
Schema-Generator: Beispiel Library.java (Auszug): 1 @XmlRootElement ( name = L i b r a r y ) 2 p u b l i c c l a s s L i b r a r y { Book.java (Auszug): 1 @XmlAttribute ( r e q u i r e d = t r u e ) 2 p r o t e c t e d S t r i n g t i t l e ; 3 @XmlAttribute ( r e q u i r e d = t r u e ) 4 p r o t e c t e d l o n g i s b n ; Author.java (Auszug): 1 @XmlElement ( r e q u i r e d = t r u e ) 2 p r o t e c t e d S t r i n g sn ; 3 @XmlElement ( r e q u i r e d = t r u e ) 4 p r o t e c t e d S t r i n g gn ; 17 / 27
Dokument/Objekt Binding Marshalling Erstellt aus Java-Objekten entsprechende XML-Dokumente Unmarshalling Erstellt aus XML-Dokumenten entsprechende Java-Objekte XML Document unmarshall Java Object Java Object marshall 18 / 27
JAXB Übersicht Klassen JAXBContext: Einstiegspunkt in der Anwendung Unmarshaller: Deserialisiert von XML nach Java Marshaller: Serialisiert Java-Objekte zu XML-Dokumenten 19 / 27
1. Code in der Anwendung: 1 L i b r a r y l i b=new L i b r a r y ( ) ; 2 Book b=new Book ( ) ; 3 Marshalling: Beispiel 4 b. s e t T i t l e ( E n t e r p r i s e I n t e g r a t i o n P a t t e r n s ) ; 5 b. s e t I s b n ( 0321200683 ) ; 6 b. g e t A u t h o r s ( ). add ( new Author ( Gregor, Hohpe ) ) ; 7 b. g e t A u t h o r s ( ). add ( new Author ( Booby, Woolf ) ) ; 8 9 l i b. getbooks ( ). add ( b ) ; 2. Aufruf des Marshallers: 1 JAXBContext c=jaxbcontext. n e w I n s t a n c e ( L i b r a r y. c l a s s ) ; 2 M a r s h a l l e r m=c. c r e a t e M a r s h a l l e r ( ) ; 3 4 m. m a r s h a l l ( l i b, L i b r a r y. xml ) ; 3. Ergebnis (generierte Datei): Library.xml 20 / 27
Unmarshalling: Beispiel 1. XML-Dokument Library.xml (Auszug): 1 <L i b r a r y> 2 <books> 3 <Book t i t l e = E n t e r p r i s e I n t e g r a t i o n P a t t e r n s i s b n= 0321200683 > 4 <a u t h o r s> 5 <Author><gn>Gregor</ gn><sn>hohpe</ sn></ Author> 6 <Author><gn>Booby</ gn><sn>woolf</ sn></ Author> 2. Aufruf des Unmarshallers: 1 JAXBContext c=jaxbcontext. n e w I n s t a n c e ( L i b r a r y. c l a s s ) ; 2 U n m a r s h a l l e r u=c. c r e a t e U n m a r s h a l l e r ( ) ; 3 4 L i b r a r y l i b =( L i b r a r y ) u. u n m a r s h a l l ( L i b r a r y. xml ) ; 3. Ergebnis (Code in der Anwendung): 1 f o r ( Book book : l i b. getbooks ( ) ) { 2 3 [... ] 21 / 27
JAXB Validierung Validierung möglich bei Marshalling und Unmarshalling Eigentliche Validierung wird von JAXP durchgeführt Prüfung erst beim Schreiben bzw. Lesen 1 SchemaFactory s f=schemafactory. n e w I n s t a n c e ( XMLConstants. W3C SCHEMA NS URI) ; 2 3 m a r s h a l l e r. setschma ( s f. newschema ( L i b r a r y. xsd ) ) ; 4 5 t r y { 6 7 m a r s h a l l e r. m a r s h a l l ( l i b, L i b r a r y. xml ) ; 8 10 9 } catch ( M a r s h a l l E x c e p t i o n mex ) { 11 mex. p r i n t S t a c k T r a c e ( ) ; 12 } 22 / 27
Weiterführende Themen Einschränkunen beim Mapping zwischem Schemata und Klassen (analog impedance mismatch) Verhalten bei Änderung der Klassen Verhalten bei Änderung der Schemata Weitere: OR-Mapping mit JAXB (HyperJAXB)... 23 / 27
Alternativen Andere Techniken SAX DOM StAX XPath... 24 / 27
Alternativen Ähnliche Projekte Castor: JBind JiXB Quick Zeus Java XML Binding Java SQL Persistence 25 / 27
Zusammenfassung 1. JAXB erlaubt uns aus Klassen entsprechende Schemas zu generieren aus Schemas entsprechende Klassen zu generieren aus Objekten entsprechende Dokumente zu generieren aus Dokumenten entsprechende Objekte zu generieren Java-Objekte gegen ein XML-Schema zu validieren 2. JAXB unterscheidet sich durch die direkte Verwendung des Datenmodells 3. JAXB kann verwendet werden wenn eine Java-Anwendung mit XML umgehen muss 26 / 27
Danke für die Aufmerksamkeit. Haben Sie Fragen? 27 / 27