Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 07



Podobne dokumenty
Katalog książek cz. 2

- wewnątrz elementów prostych występuje tylko jeden typ danych, wewnątrz złoŝonych nie moŝemy dokładnie określić liczby wystąpień elementu

Programowanie obiektowe

Plan prezentacji. Przetwarzanie dokumentów XML JAXP SAX JAXP SAX DOM STAX XSLT. Przedmiot: XML i jego zastosowania. Dr inż. Stanisław Polak JAXB

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Extensible Markup Language (XML) Wrocław, Java - technologie zaawansowane

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

Język XML Schema. UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz. UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

Integracja Obieg Dokumentów - GiS Spis treści

Wykorzystywanie parsera DOM w programach Java i PL/SQL

KLASY, INTERFEJSY, ITP

Klasy i obiekty cz II

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

akademia androida Składowanie danych część VI

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

1 Atrybuty i metody klasowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

extensible Markup Language, cz. 4 Marcin Gryszkalis, mg@fork.pl

Programowanie w Internecie. Java

Metody dostępu do danych

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Platformy Programistyczne Podstawy języka Java

Dokumentacja do API Javy.

Programowanie i projektowanie obiektowe

Języki i metody programowania Java. Wykład 2 (część 2)

JAVA I XML ZAGADNIENIA: DOM, SAX, JAXB, XMLDecoder i XMLEncoder, ANT.

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Aplikacje w środowisku Java

Podstawy programowania obiektowego

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Platformy Programistyczne Wykład z Javy dla zaawansowanych

XML w.net. Dominik Baś nr alb Wrocław, 29 maja 2007

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Multimedia JAVA. Historia

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Załącznik nr 14 Struktura logiczna korekty informacji podsumowującej o dokonanych wewnątrzwspólnotowych dostawach/nabyciach towarów (VAT-UEK)

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wykład 7: Pakiety i Interfejsy

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Obiektowy model dokumentu. Katedra Mikroelektroniki i Technik Informatycznych

Programowanie obiektowe

Programowane refleksyjne i serializacja

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Systemy Rozproszone - Ćwiczenie 6

Programowanie obiektowe

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Programowanie obiektowe

Procesowanie dokumentów XML

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Podstawy i języki programowania

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 06

Podstawy Języka Java

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Aplikacje RMI Lab4

Język ludzki kod maszynowy

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Technologie i usługi internetowe cz. 2

Wprowadzenie do języka Java

XML we własnych aplikacjach

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Schematy XML. Tomasz Traczyk.

Programowanie obiektowe

Podstawy XML-a. Zaawansowane techniki programowania

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Przykładowy dokument XML

Wzorce prezentacji internetowych

Aplikacje RMI

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w języku Java

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie obiektowe

Wykład 8: klasy cz. 4

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Diagramy klas. dr Jarosław Skaruz

XML i nowoczesne technologie zarządzania treścią

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

JAX-RS czyli REST w Javie. Adam Kędziora

Programowanie obiektowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Transkrypt:

Plan Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 07 T. Romańczukiewicz Jagiellonian University 2009/2010

Plan Plan 1 JAXB

Plan JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw 1 JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodawanie Nowych elementów Marshalling Podsumowanie

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw XML, poprawnie sformuowanie Sposoby opisu XML DTD XML Schema XPATH Sposoby prezentacji CSS XSLT DOM SAX

DOM JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw DOM i SAX Parser DOM wczytuje cały dokument do pamięci i tworzy obiekt DOM przechowujac dane w strukturze drzewa. DOM pozwala na swobodne poruszanie się po drzewie dokumentu. W przypadku przetwarzania dużych i skomplikowanych plików XML moga zostać zużyte spore zasoby pamięciowe. SAX nie wczytuje całego dokumentu lecz działa jak parser strumieniowy sterowany zdarzeniami. Zdarzenia sa zgłaszane gdy zostanie napotkany np element, dane tekstowe czy przestrzeń nazw. Obsługę zdarzeń należy zaimplementować. SAX nie umożliwia uzyskania swobodnego dostępu do dokumentu XML Przetwarzanie z użyciem SAX jest jednokierunkowe - wcześniej przetworzone dane nie moga być ponownie odczytane bez ponownego uruchomienia całej procedury. Wymagania pamięciowe SAX sa znacznie mniejsze niż DOM.

JAXB JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw JAXB - Java Architecutre for XML Binding Kolejny standard definiujacy dostęp do plików XML-owych z poziomu języka programowania. Obecnie najbardziej promowany jest przez Suna, ale dostępne sa również inne implementacje. JAXB nie posiada nie ma tu ogólnego interfejsu do parsowania plików. Interfejs tworzony na podstawie DTD lub XML-Schemy. Dostajemy kompilator schematów (lub dtd), który z tych schematów generuje klasy - dla każdego elementu XML powstaje jedna klasa. Inne podobne narzędzia: Castor, XMLBeans (Apache),

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw JAXB a SAX i DOM Zalety w stosunku do DOM-a: mniejsze wymagania pamięciowe, dzięki temu, że nie ma narzutu na generyczność DOM-a, w pamięci jest tylko to co trzeba bardziej intuicyjny dostęp do dokumentu, dzięki temu nie trzeba znać struktury dokumentu DTD nie jest interpretowane, tylko zaszyte w kodzie - dzięki temu większa wydajność Zalety w stosunku do SAX-a: łatwiejszy dostęp do pliku - cały plik jest w pamięci SAX jest read-only, a JAXB umożliwia modyfikację i zapisywanie do pliku. Model danych w SAX trzeba było tworzyć samodzielnie.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Podstawowe operacje udostępniane przez JAXB Generowanie klas. XML Schema jest używana przez kompilator JAXB binding compiler xjc do wygenerowania klas w oparciu o XML Schema Kompilowanie klas. Unmarshalling - zamiana pliku XML na obiekty Javove Modyfikacja dokumentu XML (na kopii z pamięci) Walidacja - sprawdzenie poprawności z DTD (także dokonywane na dokumencie w pamięci) Marshalling - zamiana obiektów Javy na dokument XML

JAXB - Przykład JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw https://jaxb.dev.java.net/tutorial/section_1_3-hello-world.html Listing 1: hello.xsd 1 <?xml version="1.0" encoding="utf-8"?> 2 <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema" 3 xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.0"> 4 5 <xsd:element name="greetings" type="greetinglisttype"/> 6 <xsd:complextype name="greetinglisttype"> 7 <xsd:sequence> 8 <xsd:element name="greeting" type="greetingtype" maxoccurs="unbounded"/ > 9 </xsd:sequence> 10 </xsd:complextype> 11 12 <xsd:complextype name="greetingtype"> 13 <xsd:sequence> 14 <xsd:element name="text" type="xsd:string"/> 15 </xsd:sequence> 16 <xsd:attribute name="language" type="xsd:language"/> 17 </xsd:complextype> 18 </xsd:schema>

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 2: Wywołanie kompilatora JAXB Schema 1 $ xjc -p hello hello.xsd 2 parsing a schema... 3 compiling a schema... 4 hello/greetinglisttype.java 5 hello/greetingtype.java 6 hello/objectfactory.java Zostały wygenerowane trzy klasy (wraz z dokładnym javadociem), GreetingType i GreetingListType odpowiadajace zadeklarowanym typom w schemacie oraz ObjectFactory: Listing 3: GreetingType 1 public class GreetingType { 2 (...) 3 public String gettext() { return text; } 4 public void settext(string value) { this.text = value; } 5 public String getlanguage() { return language; } 6 public void setlanguage(string value) { this.language = value; } 7 (...) 8 } Klasa GreetingType posiada metody do odczytywania i modyfikowania zawartości tekstowej elementu oraz atrybutu.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 4: GreetingListType 1 public class GreetingListType { 2 3 @XmlElement(name = "Greeting", required = true) 4 protected List<GreetingType> greeting; 5 6 public List<GreetingType> getgreeting() { 7 if (greeting == null) { 8 greeting = new ArrayList<GreetingType>(); 9 } 10 return this.greeting; 11 } 12 } Aby dodać element do listy: getgreeting().add(newitem);

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 5: ObjectFactory 1 public class ObjectFactory { 2 private final static QName _Greetings_QNAME = new QName("", "Greetings"); 3 public ObjectFactory() {} 4 / C r e a t e an i n s t a n c e o f G r e e t i n g L i s t T y p e / 5 public GreetingListType creategreetinglisttype() 6 { return new GreetingListType(); } 7 public GreetingType creategreetingtype() 8 { return new GreetingType(); } 9 10 @XmlElementDecl(namespace = "", name = "Greetings") 11 public JAXBElement<GreetingListType> creategreetings(greetinglisttype value) 12 { return new JAXBElement<GreetingListType>(_Greetings_QNAME, GreetingListType.class, null, value); } 13 14 } Obiekt zawiera metody wytwórcze (ang. factory methods) dla każdego interfejsu zawartości i elemetu ObjectFactory pozwala tworzyć nowe instancje reprezentacji dokumentu XML

Przykładowe użycie JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 6: Hello 1 public class Hello { 2 3 private ObjectFactory of; 4 private GreetingListType grlist; 5 6 public Hello(){ 7 of = new ObjectFactory(); 8 grlist = of.creategreetinglisttype(); 9 } 10 11 public void make( String t, String l ){ 12 GreetingType g = of.creategreetingtype(); 13 g.settext( t ); 14 g.setlanguage( l ); 15 grlist.getgreeting().add( g ); 16 } 17 18 public void marshal() { 19 try { 20 JAXBElement<GreetingListType> gl = of.creategreetings( grlist ); 21 JAXBContext jc = JAXBContext.newInstance( "hello" ); 22 Marshaller m = jc.createmarshaller(); 23 m.marshal( gl, System.out ); 24 } catch( JAXBException jbe ){ 25 / /... 26 } 27 } 28 }

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Konstruktor tworzy obiekt korzystajac z metody wytwórczej aby stworzyć element główny XML typu GreetingListType. Metoda make dodaje element do listy wraz z tekstem i atrybutem language. wywołujac metodę marshal lista zamieniana jest na XML i wypisywana na standardowe wyjście. Listing 7: Użycie 1 Hello h = new Hello(); 2 h.make( "Bonjour, madame", "fr" ); 3 h.make( "Hey, you", "en" ); 4 h.make( "Yo nopot, kivanok", "hu" ); 5 6 h.marshal();

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Co prawda dane w XML sa przechowywane zawsze jako tekst, ale dzięki schematom można dokładniej określić typ tych danych. Dane te moga być mapowane na typy Javy. Przykład: Listing 8: Typy 1 <xsd:simpletype name="grouptype"> 2 <xsd:restriction base="xsd:int"> 3 <xsd:mininclusive value="1"/> 4 <xsd:maxinclusive value="255"/> 5 </xsd:restriction> 6 </xsd:simpletype> Listing 9: Wynik xjc 1 public class ElementType { 2 protected int group; 3 public int getgroup() { return group; } 4 public void setgroup(int value) { this.group = value; } 5 } Typ <xsd:restriction base="xsd:int"> został zinterpretowany jako int, ale w całej klasie nie ma obsługi ograniczeń podanych w schemacie. Uwaga! JAXB nie dostarcza mechanizmów chroniacych zakres, pattern i inne zawężenia schematu. Wszystko to jest sprawdzane dopiero w momencie walidacji.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw XML Schema Type xsd:string xsd:integer xsd:int xsd.long xsd:short xsd:decimal xsd:float xsd:double xsd:boolean xsd:byte xsd:qname xsd:datetime xsd:base64binary xsd:hexbinary xsd:unsignedint xsd:unsignedshort xsd:unsignedbyte xsd:time xsd:date xsd:anysimpletype Java Data Type java.lang.string java.math.biginteger int long short java.math.bigdecimal float double boolean byte javax.xml.namespace.qname java.util.calendar byte[] byte[] long int short java.util.calendar java.util.calendar java.lang.string

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 10: Listy 1 <xsd:simpletype name="numberlisttype"> 2 <xsd:list itemtype="xsd:int"/> 3 </xsd:simpletype> 4 5 <xsd:simpletype name="stringlisttype"> 6 <xsd:list itemtype="xsd:string"/> <! dangerous! > 7 </xsd:simpletype> W pierwszym przypadku zostanie utworzona lista protected List<Integer>numbers = new ArrayList<Integer>(); Analogiczie w drugim przypadku, ale w XML reprezentacja będzie lista wartości oddzielonych białymi znakami. Jeśli wartości będa posiadały białe spacje to może być problem. Zaleca się zatem stosowanie typów złożonych.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Również <xsd:all>, <xsd:union>, <xsd:choice> oraz <xsd:sequence> moga być powiazane z niektórymi strukturami danych Javy takimi jak array, list, structure (lub record) i union. Listing 11: sequence 1 <xsd:complextype name="pointtype"> 2 <xsd:sequence> 3 <xsd:element name="x" type="xsd:int"/> 4 <xsd:element name="y" type="xsd:int"/> 5 </xsd:sequence> 6 </xsd:complextype> wynik kompilowania Listing 12: sequence w javie 1 public class PointType { 2 protected int x; 3 protected int y; 4 5 public int getx() { return x; } 6 public void setx(int value) { this.x = value; } 7 public int gety() { return y; } 8 public void sety(int value) { this.y = value; } 9 }

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 13: xsd:union 1 <xsd:simpletype name="speedornumbertype"> 2 <xsd:union> 3 <xsd:simpletype> 4 <xsd:restriction base="xsd:int"> 5 </xsd:restriction> 6 </xsd:simpletype> 7 <xsd:simpletype> 8 <xsd:restriction base="xsd:string"> 9 <xsd:pattern value="+?d+"/> 10 </xsd:restriction> 11 </xsd:simpletype> 12 </xsd:union> 13 </xsd:simpletype> Jako typ prosty unia zostanie powiazana ze zmienna typu String. Listing 14: xsd:all 1 <xsd:complextype name="dinnertype"> 2 <xsd:all> 3 <xsd:element name="starter" type="xsd:string" minoccurs="0"/> 4 <xsd:element name="soup" type="xsd:string" minoccurs="0"/> 5 <xsd:element name="entree" type="xsd:string"/> 6 <xsd:element name="dessert" type="xsd:string" minoccurs="0"/> 7 </xsd:all> 8 </xsd:complextype> Zostanie utworzona klasa zawierajaca zmienne starter, soup itd. Uwaga! maxoccurs nie może mieć wartości większej niż 1.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 15: xsd:enumeration 1 <xsd:simpletype name="ixltype"> 2 <xsd:restriction base="xsd:string"> 3 <xsd:enumeration value="estwa"/> 4 <xsd:enumeration value="estws"/> 5 <xsd:enumeration value="spdrl"/> 6 <xsd:enumeration value="spdrs"/> 7 <xsd:enumeration value="vgs80"/> 8 </xsd:restriction> 9 </xsd:simpletype> 10 \begin{lstlisting} Listing 16: xsd:enumeration w Javie 1 public enum IXLType { 2 3 E_STW_A("eStwA"), 4 E_STW_S("eStwS"), 5 SP_DR_L("SpDrL"), 6 SP_DR_S("SpDrS"), 7 VGS_80("VGS80"); 8 9 private final String value; 10 11 IXLType(String v) { 12 value = v; 13 } 14 15 public String value() { 16 return value; 17 } 18 }

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 17: xsd:enumeration 1 <xsd:simpletype name="ixltype"> 2 <xsd:restriction base="xsd:string"> 3 <xsd:enumeration value="estwa"/> 4 <xsd:enumeration value="estws"/> 5 <xsd:enumeration value="spdrl"/> 6 <xsd:enumeration value="spdrs"/> 7 <xsd:enumeration value="vgs80"/> 8 </xsd:restriction> 9 </xsd:simpletype> Listing 18: xsd:enumeration w Javie 1 public enum IXLType { 2 3 E_STW_A("eStwA"), 4 E_STW_S("eStwS"), 5 SP_DR_L("SpDrL"), 6 SP_DR_S("SpDrS"), 7 VGS_80("VGS80"); 8 9 private final String value; 10 IXLType(String v) { value = v;} 11 public String value() { return value; } 12 } Nazwy zostały zmienione.

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Można też w taki sposób: Listing 19: xsd:enumeration 1 <xsd:simpletype name="ixltype"> 2 <xsd:restriction base="xsd:string"> 3 <xsd:enumeration value="estwa"/> 4 <xsd:annotation><xsd:appinfo> 5 <jxb:typesafeenummember name="estwa"/> 6 </xsd:appinfo></xsd:annotation> 7... 8 </xsd:restriction> 9 </xsd:simpletype> Uwaga: w schemacie musi zostać dołaczona przestrzeń nazw xmlns:jxb="http://java.sun.com/xml/ns/jaxb" Listing 20: xsd:enumeration w Javie 1 public enum IXLType { 2 3 estwa, 4 estws, 5 SpDrL, 6 SpDrS, 7 VGS80; 8 9 public String value() { return name(); } 10... 11 }

Unmarshalling JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Po powiazaniu klas Javy z typami XML Schema przy pomocy xjc można przystapić do wczytywania danych. Unmarshalling czyli zamiana pliku XML na obiekty Javy Najporościej utworzyć obiekt JAXBContext, następnie Unmarshaller i wywołać metodę unmrshal. Obiekt JAXBContext zawiera informacje wiaż ace informacje pomiędzy XML i Java. Można go utworzyć przy pomocy metody newinstance z parametrem będacym nazwa pakietu utworzonego przez xjc Z tego kontekstu można utworzyć obiekt Unmarshaller, którego metoda unmarshal zwraca obiekt JAXBElement powiazany z elementem głównym dokumentu. Listing 21: xsd:enumeration w Javie 1 public <T> T unmarshal( Class<T> docclass, InputStream inputstream ) 2 throws JAXBException { 3 String packagename = docclass.getpackage().getname(); 4 JAXBContext jc = JAXBContext.newInstance( packagename ); 5 Unmarshaller u = jc.createunmarshaller(); 6 JAXBElement<T> doc = (JAXBElement<T>)u.unmarshal( inputstream ); 7 return doc.getvalue(); 8 }

Walidacja JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Przed przekształceniem danych z dokumentu XML na obiekty Javy można wykonać walidacji. Sam JAXB nie stosuje się do ograniczeń narzuconych przez schemat. Należy zatem tę operację przeprowadzić przed procedura unmarshal i po marshal. Służa do tego obiekt klasy javax.xml.validation.schema, który zostaje przekazany do obiektu Unmarshaller. Listing 22: Walidacja 1 Schema myschema; 2 SchemaFactory sf = 3 SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI ); 4 try { 5 myschema = sf.newschema( file ); 6 } catch( SAXException saxe ){ 7 / /... ( e r r o r h a n d l i n g ) 8 myschema = null; 9 } 10 11 JAXBContext jc = JAXBContext.newInstance( packagepath ); 12 Unmarshaller u = jc.createunmarshaller(); 13 u.setschema( myschema ); W przypadku gdy walidacja zawiedzie zostanie rzucony wyjatek. Wyjatki takie mogę być obsługiwane przez interfejs javax.xml.bind.validationeventhandler

Kontekst JAXB JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Obiekt JAXBContext tworzony jest na samym poczatku operacji wczytywania pliku XML. Można go utworzyć np. JAXBContext ctxt = JAXBContext.newInstance( "some foo:more.bar"); gdzie dwukropkiem oddziela się pakiety. Każdy pakiet musi zawierać klasę ObjectFactory lub plik jaxb.index: Listing 23: jaxb.index 1 # package some. f o o 2 # class some. foo. Foo 3 Foo 4 # inner class some. foo. Foo. Boo 5 Foo.Boo zawierajacy listę klas w danym pakiecie. Klasy ObjectFactory sa generowane ze schematu Innym sposobem utworzenia kontekstu jest podanie listy wszystkich klas: JAXBContext ctxt = JAXBContext.newInstance( Foo.class, Bar.class );

Użycie danych JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Dane można odczytywać przy pomocy metod typu get a zapisywać przy pomocy metod typu set. Wygodniej jest jednak stworzyć klasy obsługujace poszczególne typy schematu. Ich metody moga przetwarzać atrybuty i elementy potomne wywołujac ich handlery. Listing 24: XML Schema 1 <xsd:complextype name="persontype"> 2 <xsd:sequence> 3 <xsd:element name="name" type="nametype"> 4 <xsd:element name="addr" type="addrtype" minoccurs="0"> 5 <xsd:element name="child" type="childtype" minoccurs="0" maxoccurs=" unbounded"> 6 </xsd:sequence> 7 <xsd:attribute name="resident" type="xsd:boolean"/> 8 </xsd:complextype> 9 10 <xsd:complextype name="childtype"> 11 <xsd:complexcontent> 12 <xsd:extension base="persontype"/> 13 </xsd:complexcontent> 14 </xsd:complextype>

Użycie danych c.d JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 25: Handler classes 1 abstract class Handler { 2 protected static Map<Class<?>,Handler> ourclass2conv = new HashMap<Class<?>, Handler>(); 3 4 static { 5 ourclass2conv.put( PersonType.class, new PersonHandler() ); 6 ourclass2conv.put( NameType.class, new NameHandler() ); 7 ourclass2conv.put( AddrType.class, new AddrHandler() ); 8 ourclass2conv.put( ChildType.class, new ChildHandler() ); 9 / /... 10 } 11 public abstract void handle( Object o ); 12 protected void process( Object obj ){ 13 if( obj!= null ){ 14 Handler h = ourclass2conv.get( obj.getclass() ); 15 if( h!= null ){ h.handle( obj ); } 16 } 17 } 18 19 protected <T> void processlist( List<T> list ){ 20 for( T obj: list ){ 21 Handler h = this.gethandler( obj ); 22 h.process( obj ); 23 } 24 } 25 }

Użycie danych c.d JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 26: Handler classes 1 class PersonHandler extends Handler { 2 public void handle( Object o ){ 3 PersonType p = (PersonType)o; 4 process( p.getname() ); 5 if( p.isresident() ){ process( p.getaddr() ); } 6 processlist( p.getchild ); 7 } 8 }

ObjectFactory JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Jedna z klas wygenerowanych przez xjc jest klasa ObjectFactory. Klasa ta zawiera metody do tworzenia elementów reprezentowanych przez objekty JAXBElement<?>: Listing 27: ObjectFactory 1 ObjectFactory objfact = new ObjectFactory(); 2 RulebaseType rulebase = objfact.createrulebasetype(); 3 JAXBElement<RulebaseType> doc = objfact.createrulebase( rulebase ); rulebase - znacznik elementu głównego. proste elementy nie potrzebuja JAXBElement<?>. Można je utworzyć bezpośrednio z wywołania metody: ModuleType module = objfact.createmoduletype(); Objekt JAXBElement<?> jest wymagany w przypadku elementów zawierajacych sekwencję elementów tego samego typu ale o innych znacznikach: Listing 28: Przykład 1 <xsd:complextype name="foobarlisttype"> 2 <xsd:sequence> 3 <xsd:choice minoccurs="0" maxoccurs="unbounded"> 4 <xsd:element name="foo" type="foobartype"/> 5 <xsd:element name="bar" type="foobartype"/> 6 </xsd:choice> 7 </xsd:sequence> 8 </xsd:complextype>

ObjectFactory c.d. JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Listing 29: ObjectFactory 1 FooBarListType fblelem = objfact.createfoobarlisttype(); 2 List<JAXBElement<FooBarType>> fblist = fblelem.getfooorbar(); 3 4 / / create a " foo " element 5 FooBarType foo = objfact.createfoobartype(); 6 / /... ( add a t t r i b u t e s and components t o f o o ) 7 / / Create the element <foo >... < / foo > 8 JAXBElement<FooBarType> fooelem = objfact.createfoobartypefoo( foo ); 9 / / Add i t t o i t s p a r e n t s l i s t. 10 fblist.add( fooelem ); 11 12 / / create a " bar " element 13 FooBarType bar = objfact.createfoobartype(); 14 / /... ( add a t t r i b u t e s and components t o bar ) 15 / / Create the element <bar >... < / bar> 16 JAXBElement<FooBarType> barelem = objfact.createfoobartypebar( bar ); 17 / / Add i t t o i t s p a r e n t s l i s t. 18 fblist.add( barelem );

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Aby dodać element potomny x wewnatrz elementu current (np. głównego) należy Stworzyć element xelem przy pomocy metody createx. Dodać nowo stworzony current.setx( xelem ). Powtórzyć ten proces rekurencyjnie dla elementów potomnych nowego elementu Listing 30: Dodawanie nowych obiektów 1 / / Create o r d e r and i n s e r t i n top l e v e l document, a l i s t o f o r d e r s 2 OrderType orderelem = objfact.createordertype(); 3 folder.getorders().add( orderelem ); 4 5 / / Create and i n s e r t the customer element. 6 CustomerType custelem = objfact.createcustomertype(); 7 orderelem.setcustomer( custelem ); 8 / / Complete customer. 9 custelem.setid( custid ); 10 custelem.setname( custname ); 11 12 / / Create and add item elements. 13 List<ItemType> itemlist = orderelem.getitems(); 14 for( Item item: items ){ 15 ItemType itemelem = objfact.createitemtype(); 16 itemlist.add( itemelem ); 17 itemelem.setid( item.id ); 18 itemelem.setquantity( item.qtty ); 19 }

JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Dodawanie Nowych elementów c.d. Listing 31: schemat 1 <xsd:complextype name="customertype"> 2 <xsd:sequence> 3 <xsd:element name="id" type="xsd:int"/> 4 <xsd:element name="name" type="xsd:string"/> 5 </xsd:sequence> 6 </xsd:complextype> 7 8 <xsd:complextype name="itemtype"> 9 <xsd:sequence> 10 <xsd:element name="id" type="xsd:string"/> 11 <xsd:element name="quantity" type="xsd:int"/> 12 </xsd:sequence> 13 </xsd:complextype> 14 15 <xsd:complextype name="ordertype"> 16 <xsd:sequence> 17 <xsd:element name="customer" type="customertype"/> 18 <xsd:element name="items" type="itemtype" maxoccurs="unbounded"/> 19 </xsd:sequence> 20 </xsd:complextype> 21 22 <xsd:element name="folder"> 23 <xsd:complextype> 24 <xsd:sequence> 25 <xsd:element name="orders" type="ordertype" maxoccurs="unbounded"/> 26 </xsd:sequence> 27 </xsd:complextype> 28 </xsd:element>

Marshalling JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw Końcowym etapem tworzenia lub modyfikowania dokumentu XML jest procedura zwana Marshalling. Po utworzeniu obiektu Marshaller z obiektu JAXBContext można ustawić szereg właściwości (np ustawianie formatowania wydruku, sposobu dołaczenia schematu, strony kodowej itp.) Listing 32: Marshalling 1 import java.io.*; 2 import javax.xml.bind.* 3 4 void writedocument( Object document, String pathname ) 5 throws JAXBException, IOException { 6 Class<T> clazz = document.getvalue().getclass(); 7 JAXBContext context = 8 JAXBContext.newInstance( clazz.getpackage().getname() ); 9 Marshaller m = context.createmarshaller(); 10 m.setproperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); 11 m.marshal( document, new FileOutputStream( pathname ) ); 12 }

JAXB JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw JAXB jest architektura powiazań pomiędzy XML i klasami Javy Najpierw na podstawie XML Schema generowane sa klasy odpowiadajace typom zadeklarowanym w schemacie. Klasy te zawieraja metody do czytania i manipulacji obiektami reprezentujacymi elementy XML Typy Javy nie zachowuja restrykcji nakładanych w schemacie. Przed wczytaniem danych lub po ich zapisaniu do pliku możliwa jest walidacja. Generowana jest też klasa ObjectFactory pozwalajaca tworzyć nowe instancje reprezentacji dokumentu XML Dokument XML wczytywany jest w trakcie procedury Unmarshalling na podstawie kontekstu zawierajacego informacje o pakiecie. Po modyfikacji zmiennych można zapisać dane do pliku przy pomocy metody Marshalling.

JAXB a DOM i SAX JAXB Przypomnienie Wstęp Przykład Typy danych Unmarshalling Dodaw DOM wczytywał cały dokument do pamięci Dane przechowywane były w uniwersalnej strukturze drzewa Dzięki odpowiednim metodom można się było poruszać po całym drzewie dokumentu SAX przetwarzał dokument w trakcie czytania. Aby stworzyć model danych należało samemu go zaimplementować. SAX przetwarzał dokument jednokierunkowo. JAXB sam tworzy strukturę danych na podstawie istniejacego już schematu. Do danych jest dostęp cały czas.