XML in own applications

Podobne dokumenty
XML in own applications

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

Kotwasiński Obsługa XMLa z poziomu Javy

Wykorzystanie XML a we własnych aplikacjach

SAX i DOM wykorzystanie XML-a we własnych aplikacjach. Simple API for XML Parsing Document Object Model

Modele dostępu do dokumentu XML. Implementacja modelu parser. SAX2 pakiet org.xml.sax. Działanie modelu SAX przykład

SAX2 pakiet org.xml.sax

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

Procesowanie dokumentów XML

Wykorzystywanie parsera DOM w programach Java i PL/SQL

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

Zaawansowane aplikacje WWW - laboratorium

Podstawy XML-a. Zaawansowane techniki programowania

XML i Java. Technologie zarządzania treścią. dr inż. Robert Perliński rperlinski@icis.pcz.pl

XML i Java 1. XML Budowa dokumentu XML. Projektowanie systemów informatycznych

XML w bazach danych, standardy wiaż ace dokumenty XML

Programowanie obiektowe

XML w bazach danych, standardy wiążące dokumenty XML

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

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusz Mikoda

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

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

XML i nowoczesne technologie zarządzania treścią

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

libxml2 parser DOM dla C++ czwartek, 8 grudnia 11

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

XML i nowoczesne technologie zarządzania treścią

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

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

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

Programowanie obiektowe

Lab. Efekt 1 - kolokwium wykładowe. Efekt 2, 3 i 4 - samodzielnie rozwiązywane ćwiczenia laboratoryjne.

Systemy operacyjne na platformach mobilnych

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Tworzenie aplikacji w języku Java

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

Drzewa DOM. Maciej Zakrzewicz.

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

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

Biblioteki dzielone, XML i readline

Certyfikaty firmy Sun. Ścieżka certyfikacyjna dla Javy Egzamin SCJP

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

akademia androida Składowanie danych część VI

Programowanie obiektowe

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Kurs programowania. Wykład 9. Wojciech Macyna

Zarządzanie sieciami telekomunikacyjnymi

Programowanie obiektowe

Metody dostępu do danych

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Architektura rozproszonych magazynów danych

LAB 7. XML EXtensible Markup Language - Rozszerzalny Język Znaczników XSD XML Schema Definition Definicja Schematu XML

Java. Programowanie Obiektowe Mateusz Cicheński

Platformy Programistyczne Podstawy języka Java

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Laboratorium Programowania Kart Elektronicznych

Przypomnienie o klasach i obiektach

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

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

Programowanie Komputerów

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Wywoływanie metod zdalnych

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

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe

Rozproszone systemy internetowe. Wprowadzenie. Koncepcja zdalnego wywołania procedury

Programowane refleksyjne i serializacja

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

DOM SAX AJAX. SAX,DOMiAJAX. Bartłomiej Świercz. Katedra Mikroelektroniki i Technik Informatycznych. Łódź, 11 kwietnia 2010

Systemy Rozproszone - Ćwiczenie 6

Programowanie obiektowe

Zaawansowany kurs języka Python

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

5.14 JSP - Przykład z obiektami sesji Podsumowanie Słownik Zadanie... 86

Systemy operacyjne na platformach mobilnych

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

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

Katalog książek cz. 2

SOAP. Autor: Piotr Sobczak

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

XML Schema. Motywacja, struktura schematu, typy złożone. Patryk Czarnik. Instytut Informatyki UW

[Android] Podstawy programowania

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie w Javie wykład 8 Interfejsy

XML standardy pokrewne

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Systemy Rozproszone. Spis treści. Temat projektu: Regułowy system analizujacy logi. autorzy: Rafał Sadłowski, Sebastian Falkus, Michał Różycki

Transkrypt:

XML in own applications Patryk Czarnik Institute of Informatics University of Warsaw XML and Modern Techniques of Content Management 2010/11 Patryk Czarnik 10 Programming XML 2010/11 1 / 43

1 Introduction XML in own applications 2 Models Generyczne drzewo dokumentu (DOM) XML binding (JAXB) Model zdarzeniowy (SAX) Model strumieniowy (StAX) Porównanie 3 Obsługa standardów około-xml-owych Walidacja Transformacje

1 Introduction XML in own applications 2 Models Generyczne drzewo dokumentu (DOM) XML binding (JAXB) Model zdarzeniowy (SAX) Model strumieniowy (StAX) Porównanie 3 Obsługa standardów około-xml-owych Walidacja Transformacje

Introduction XML in own applications XML in own applications what for? To access data in XML format To use XML as data carrier (storage and transmission) To support XML applications (Web, content management,... ) To make use of XML-related standards (XML Schema, XInclude, XSLT, XQuery,... ) To make use of XML-based software technology (Web Services etc.) Patryk Czarnik 10 Programming XML 2010/11 4 / 43

Introduction XML in own applications how? XML in own applications Bad way Treat XML as plain text files and write low-level XML support from scratch Better approach Use existing libraries and tools Even better Use standardised interfaces independent from particular suppliers Patryk Czarnik 10 Programming XML 2010/11 5 / 43

Introduction XML in own applications XML in Java Java motivation for us One of the most popular programming languages Very good XML support Standards Both included in Java Standard Edition from 6.0 Java API for XML Processing (JAXP) many interfaces and few classes, "factories" and pluggability layer support for XML parsing and serialisation (DOM, SAX, StAX) support for XInclude, XML Schema, XPath, XSLT Java API for XML Binding (JAXB) binding between Java objects and XML documents Patryk Czarnik 10 Programming XML 2010/11 6 / 43

Introduction XML in own applications XML in Java Java motivation for us One of the most popular programming languages Very good XML support Standards Both included in Java Standard Edition from 6.0 Java API for XML Processing (JAXP) many interfaces and few classes, "factories" and pluggability layer support for XML parsing and serialisation (DOM, SAX, StAX) support for XInclude, XML Schema, XPath, XSLT Java API for XML Binding (JAXB) binding between Java objects and XML documents Patryk Czarnik 10 Programming XML 2010/11 6 / 43

1 Introduction XML in own applications 2 Models Generyczne drzewo dokumentu (DOM) XML binding (JAXB) Model zdarzeniowy (SAX) Model strumieniowy (StAX) Porównanie 3 Obsługa standardów około-xml-owych Walidacja Transformacje

Classification of XML access models Document read into memory generic interface example: DOM interface depending on document type (schema) example: JAXB Document processed node by node event model (push parsing) example: SAX streaming model (pull parsing) example: StAX Patryk Czarnik 10 Programming XML 2010/11 8 / 43

Classification of XML access models Document read into memory generic interface example: DOM interface depending on document type (schema) example: JAXB Document processed node by node event model (push parsing) example: SAX streaming model (pull parsing) example: StAX Patryk Czarnik 10 Programming XML 2010/11 8 / 43

Classification of XML access models Document read into memory generic interface example: DOM interface depending on document type (schema) example: JAXB Document processed node by node event model (push parsing) example: SAX streaming model (pull parsing) example: StAX Patryk Czarnik 10 Programming XML 2010/11 8 / 43

Drzewo dokumentu (DOM) Document object model Whole document in memory, as tree of objects W3C Recommendations DOM Level 1 1998 DOM Level 3 2004 Many (specification) modules Dom Core the most important DOM module for XML Patryk Czarnik 10 Programming XML 2010/11 9 / 43

DOM important interfaces Node NodeList NamedNodeMap Element Attr Entity Document Processing Instruction CharacterData Entity Reference DocumentFragment Comment Text DocumentType CDATASection

Interfejs Node wybrane metody Drzewo dokumentu (DOM) Content access Content modification getattributes() appendchild(node) getchildnodes() insertbefore(node, Node) getfirstchild() removechild(node) getlastchild() replacechild(node, Node) getnextsibling() setnodevalue(string) getprevioussibling() setnodename(string) getnodename() Copying getnodevalue() clonenode(boolean) getnodetype() getownerdocument() Patryk Czarnik 10 Programming XML 2010/11 11 / 43

Interfejs Node wybrane metody Drzewo dokumentu (DOM) Content access Content modification getattributes() appendchild(node) getchildnodes() insertbefore(node, Node) getfirstchild() removechild(node) getlastchild() replacechild(node, Node) getnextsibling() setnodevalue(string) getprevioussibling() setnodename(string) getnodename() Copying getnodevalue() clonenode(boolean) getnodetype() getownerdocument() Patryk Czarnik 10 Programming XML 2010/11 11 / 43

Interfejs Node wybrane metody Drzewo dokumentu (DOM) Content access Content modification getattributes() appendchild(node) getchildnodes() insertbefore(node, Node) getfirstchild() removechild(node) getlastchild() replacechild(node, Node) getnextsibling() setnodevalue(string) getprevioussibling() setnodename(string) getnodename() Copying getnodevalue() clonenode(boolean) getnodetype() getownerdocument() Patryk Czarnik 10 Programming XML 2010/11 11 / 43

Drzewo dokumentu (DOM) Example introduction Example document <?xml version="1.0"?> <numbers> <group important="yes"> <l>52 </l><s>25</s> </group> <group important="no"> <l>5</l><l>21</l> </group> <group important="yes"> <s>9</s><l>12 </l> </group> </numbers> Problem Count sum of element l values from important groups. Patryk Czarnik 10 Programming XML 2010/11 12 / 43

Drzewo dokumentu (DOM) Example introduction Example document <?xml version="1.0"?> <numbers> <group important="yes"> <l>52 </l><s>25</s> </group> <group important="no"> <l>5</l><l>21</l> </group> <group important="yes"> <s>9</s><l>12 </l> </group> </numbers> Problem Count sum of element l values from important groups. Patryk Czarnik 10 Programming XML 2010/11 12 / 43

Drzewo dokumentu (DOM) Example introduction Example document <?xml version="1.0"?> <numbers> <group important="yes"> <l>52 </l><s>25</s> </group> <group important="no"> <l>5</l><l>21</l> </group> <group important="yes"> <s>9</s><l>12 </l> </group> </numbers> Problem Count sum of element l values from important groups. Patryk Czarnik 10 Programming XML 2010/11 12 / 43

DOM example (1) Models Drzewo dokumentu (DOM) Program i n t r e s u l t = 0; DocumentBuilderFactory f a c t o r y = DocumentBuilderFactory. newinstance ( ) ; f a c t o r y. s e t V a l i d a t i n g ( true ) ; DocumentBuilder b u i l d e r = f a c t o r y. newdocumentbuilder ( ) ; Document doc = b u i l d e r. parse ( args [ 0 ] ) ; Node cur = doc. g e t F i r s t C h i l d ( ) ; while ( cur. getnodetype ( )! = Node.ELEMENT_NODE) { cur = cur. g e t N e x t S i b l i n g ( ) ; } cur = cur. g e t F i r s t C h i l d ( ) ; while ( cur!= null ) { i f ( cur. getnodetype ( ) == Node.ELEMENT_NODE) { S t r i n g a t t V a l = cur. g e t A t t r i b u t e s ( ). getnameditem ( " important " ). getnodevalue ( ) ; i f ( " yes ". equals ( a t t V a l ) { r e s u l t += processgroup ( cur ) ; } } cur = cur. g e t N e x t S i b l i n g ( ) ; } Patryk Czarnik 10 Programming XML 2010/11 13 / 43

DOM example (2) Models Drzewo dokumentu (DOM) Method processgroup private s t a t i c i n t processgroup ( Node group ) { i n t r e s u l t = 0; } Node cur = group. g e t F i r s t C h i l d ( ) ; while ( cur!= null ) { i f ( cur. getnodetype ( ) == Node.ELEMENT_NODE && cur. getnodename ( ). equals ( " l " ) ) { S t r i n g B u f f e r buf = new S t r i n g B u f f e r ( ) ; Node c h i l d = cur. g e t F i r s t C h i l d ( ) ; while ( c h i l d!= null ) { i f ( c h i l d. getnodetype ( ) == Node.TEXT_NODE) buf. append ( c h i l d. getnodevalue ( ) ) ; c h i l d = c h i l d. g e t N e x t S i b l i n g ( ) ; } r e s u l t += I n t e g e r. p a r s e I n t ( buf. t o S t r i n g ( ) ) ; ; } cur = cur. g e t N e x t S i b l i n g ( ) ; } return r e s u l t ; Patryk Czarnik 10 Programming XML 2010/11 14 / 43

XML binding idea Models XML binding (JAXB) XML documents and objects (e.g. Java): schema (type) corresponds to class, document/node corresponds to object. Implementations: JAXB (Sun), Castor (Exolab), Dynamic XML (Object Space). Patryk Czarnik 10 Programming XML 2010/11 15 / 43

XML binding idea Models XML binding (JAXB) XML documents and objects (e.g. Java): schema (type) corresponds to class, document/node corresponds to object. Implementations: JAXB (Sun), Castor (Exolab), Dynamic XML (Object Space). Patryk Czarnik 10 Programming XML 2010/11 15 / 43

XML binding (JAXB) Java API for XML Binding (JAXB) Inspired by Sun, supported by java.net Current version: 2.0 Motivated by Web Services Components generic API fragment two-way translation specification customisation and annotations Patryk Czarnik 10 Programming XML 2010/11 16 / 43

JAXB usage scenarios XML binding (JAXB) Schema to Java 1 Schema preparation 2 Schema to Java compilation (XJC) result: annotated classes basing on schema types transalation customisable 3 Developing application making use of generic part of JAXB API generated classes Java to Schema 1 Model classes preparation 2 Adding annotations classes 3 Making use of generic JAXB API to perform marchalling, unmarchalling etc. 4 (Optional) Generating schema basing on classes Patryk Czarnik 10 Programming XML 2010/11 17 / 43

XML binding (JAXB) JAXB example(1) Schema and generated classes Schema <xs:element name="numbers"> <xs:complextype> <xs:sequence> <xs:element ref="group" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="l" type="xs:integer"/> Generated classes Numbers List<Group> getgroup() Corresponding classes JAXBElement<BigInteger> QName getname() BigInteger getvalue() void setvalue(biginteger)... <xs:element name="s" type="xs:integer"/> Patryk Czarnik 10 Programming XML 2010/11 18 / 43

XML binding (JAXB) JAXB example(1) Schema and generated classes Schema <xs:element name="numbers"> <xs:complextype> <xs:sequence> <xs:element ref="group" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="l" type="xs:integer"/> Generated classes Numbers List<Group> getgroup() Corresponding classes JAXBElement<BigInteger> QName getname() BigInteger getvalue() void setvalue(biginteger)... <xs:element name="s" type="xs:integer"/> Patryk Czarnik 10 Programming XML 2010/11 18 / 43

XML binding (JAXB) JAXB example (2) Schema and generated classes Schema <xs:element name="group"> <xs:complextype> <xs:choice minoccurs="0" maxoccurs="unbounded"> <xs:element ref="l"/> <xs:element ref="s"/> </xs:choice> <xs:attribute name="important"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="yes"/> <xs:enumeration value="no"/> </xs:restriction> </xs:simpletype> </xs:attribute> </xs:complextype> </xs:element> Generated classes Group List<JAXBElement <BigInteger> > getlors() String getimportant() void setimportant(string) Patryk Czarnik 10 Programming XML 2010/11 19 / 43

XML binding (JAXB) JAXB example (2) Schema and generated classes Schema <xs:element name="group"> <xs:complextype> <xs:choice minoccurs="0" maxoccurs="unbounded"> <xs:element ref="l"/> <xs:element ref="s"/> </xs:choice> <xs:attribute name="important"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="yes"/> <xs:enumeration value="no"/> </xs:restriction> </xs:simpletype> </xs:attribute> </xs:complextype> </xs:element> Generated classes Group List<JAXBElement <BigInteger> > getlors() String getimportant() void setimportant(string) Patryk Czarnik 10 Programming XML 2010/11 19 / 43

JAXB example(3) Models XML binding (JAXB) Program i n t r e s u l t = 0; JAXBContext j c = JAXBContext. newinstance ( " jaxb_generated " ) ; Unmarshaller u = j c. createunmarshaller ( ) ; Liczby doc = ( Liczby ) u. unmarshal (new FileInputStream ( args [ 0 ] ) ) ; L i s t <Group> groups = doc. getgroup ( ) ; for ( Group group : groups ) { i f ( " tak ". equals ( grupa. getimportant ( ) ) ) { r e s u l t += processgroup ( group ) ; } } Patryk Czarnik 10 Programming XML 2010/11 20 / 43

JAXB example (4) Models XML binding (JAXB) Method processgroup private s t a t i c i n t processgroup ( Group group ) { i n t r e s u l t = 0; } L i s t <JAXBElement< BigInteger >> elems = group. getlors ( ) ; for ( JAXBElement< BigInteger > elem : elems ) { i f ( " l ". equals ( elem. getname ( ). getlocalpart ( ) ) ) { B i g I n t e g e r v a l = elem. getvalue ( ) ; r e s u l t += v a l. i n t V a l u e ( ) ; } } return r e s u l t ; Patryk Czarnik 10 Programming XML 2010/11 21 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Model zdarzeniowy idea Model zdarzeniowy (SAX) Umożliwienie programiście podania dowolnego kodu, wykonywanego podczas czytania dokumentu: dokument XML jako ciag zdarzeń (np. poczatek elementu, węzeł tekstowy, koniec dokumentu,... ), procedury podane przez programistę wykonywane w odpowiedzi na zdarzenia różnego typu, treść dokumentu przekazywana w parametrach. Po stronie parsera: analiza leksykalna, kontrola poprawności składniowej, opcjonalnie walidacja. Możliwe realizacje w zależności od języka programowania: obiekt ( handler ) zawierajacy zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe), funkcje (języki funkcyjne), wskaźniki do funkcji (C). Patryk Czarnik 10 Programming XML 2010/11 22 / 43

Simple API for XML (SAX) Model zdarzeniowy (SAX) Standard odpowiedni dla języków obiektowych. wzorcowe interfejsy zapisane w Javie Patryk Czarnik 10 Programming XML 2010/11 23 / 43

SAX jak używać? (1) Models Model zdarzeniowy (SAX) Kroki implementacji 1 Klasa implementujaca interfejs ContentHandler. 2 Opcjonalnie klasa implementujaca interfejsy ErrorHandler, DTDHandler, EntityResolver. jedna klasa może implementować wszystkie te interfejsy, możemy w tym celu rozszerzyć klasę DefaultHandler, która zawiera puste implementacje wszystkich wymaganych metod. Patryk Czarnik 10 Programming XML 2010/11 24 / 43

SAX jak używać? (2) Models Model zdarzeniowy (SAX) Schemat typowej aplikacji 1 Pobranie obiektu XMLReader z fabryki. 2 Stworzenie obiektu "handlera". 3 Rejestracja handlera w parserze (XMLReader) metodami setcontenthandler, seterrorhandler itp. 4 Wywołanie metody parse. 5 Wykonanie (przez parser) naszego kodu z handlera. 6 Wykorzystanie danych zebranych przez handler. Patryk Czarnik 10 Programming XML 2010/11 25 / 43

SAX przykład (1) Models Model zdarzeniowy (SAX) Implementacja ContentHandler-a private s t a t i c class NumbersHandler extends DefaultHandler { enum State {OUT, GROUP, L } ; private i n t r e s u l t = 0; private State s t a t e = State.OUT; private S t r i n g B u f f e r buf ; public i n t getresult ( ) { return r e s u l t ; } public void startelement ( S t r i n g u r i, S t r i n g localname, S t r i n g qname, A t t r i b u t e s a t t r i b u t e s ) throws SAXException { i f ( " group ". equals (qname ) ) { S t r i n g a t t r V a l = a t t r i b u t e s. getvalue ( " important " ) ; i f ( " yes ". equals ( a t t r V a l ) ) s t a t e = State.GROUP; } else i f ( " l ". equals (qname ) ) { i f ( stan == State.GROUP) { s t a t e = Stan. L ; buf = new S t r i n g B u f f e r ( ) ; } } } Patryk Czarnik 10 Programming XML 2010/11 26 / 43

SAX przykład (2) Models Model zdarzeniowy (SAX) Ciag dalszy LiczbyHandler public void characters ( char [ ] ch, i n t s t a r t, i n t l e n g t h ) throws SAXException { i f ( stan == Stan. L ) buf. append ( ch, s t a r t, l e n g t h ) ; } public void endelement ( S t r i n g u r i, S t r i n g localname, S t r i n g qname) throws SAXException { i f ( " group ". equals (qname ) ) { i f ( s t a t e == State.GRUPA) { s t a t e = State.ZEWN; } } else i f ( " l ". equals (qname ) ) { i f ( s t a t e == State. LICZBA ) { s t a t e = State.GRUPA; r e s u l t += I n t e g e r. p a r s e I n t ( buf. t o S t r i n g ( ) ) ; } } } } / NumbersHandler / Patryk Czarnik 10 Programming XML 2010/11 27 / 43

SAX przykład (3) Models Model zdarzeniowy (SAX) Program SAXParserFactory f a c t o r y = SAXParserFactory. newinstance ( ) ; f a c t o r y. s e t V a l i d a t i n g ( true ) ; SAXParser parser = f a c t o r y. newsaxparser ( ) ; LiczbyHandler handler = new NumbersHandler ( ) ; parser. parse ( args [ 0 ], handler ) ; System. out. p r i n t l n ( "Sum: " +handler. getresult ( ) ) ; Patryk Czarnik 10 Programming XML 2010/11 28 / 43

Filtry SAX Models Model zdarzeniowy (SAX) Implementuja interfejs XMLFilter, a także (pośrednio) XMLReader zachowuja się jak parser, ale ich źródłem danych jest inny XMLReader (parser lub filtr). można je łaczyć w łańcuchy. Domyślna implementacja: XMLFilterImpl: przepuszcza wszystkie zdarzenia, implementuje interfejsy ContentHandler, ErrorHandler itp. Filtry pozwalaja na: filtrowanie zdarzeń, zmianę danych (a nawet struktury) dokumentu przed wysłaniem zdarzenia dalej, przetwarzanie dokumentu przez wiele modułów podczas jednego parsowania. Patryk Czarnik 10 Programming XML 2010/11 29 / 43

Filtry SAX Models Model zdarzeniowy (SAX) Implementuja interfejs XMLFilter, a także (pośrednio) XMLReader zachowuja się jak parser, ale ich źródłem danych jest inny XMLReader (parser lub filtr). można je łaczyć w łańcuchy. Domyślna implementacja: XMLFilterImpl: przepuszcza wszystkie zdarzenia, implementuje interfejsy ContentHandler, ErrorHandler itp. Filtry pozwalaja na: filtrowanie zdarzeń, zmianę danych (a nawet struktury) dokumentu przed wysłaniem zdarzenia dalej, przetwarzanie dokumentu przez wiele modułów podczas jednego parsowania. Patryk Czarnik 10 Programming XML 2010/11 29 / 43

Filtry SAX Models Model zdarzeniowy (SAX) Implementuja interfejs XMLFilter, a także (pośrednio) XMLReader zachowuja się jak parser, ale ich źródłem danych jest inny XMLReader (parser lub filtr). można je łaczyć w łańcuchy. Domyślna implementacja: XMLFilterImpl: przepuszcza wszystkie zdarzenia, implementuje interfejsy ContentHandler, ErrorHandler itp. Filtry pozwalaja na: filtrowanie zdarzeń, zmianę danych (a nawet struktury) dokumentu przed wysłaniem zdarzenia dalej, przetwarzanie dokumentu przez wiele modułów podczas jednego parsowania. Patryk Czarnik 10 Programming XML 2010/11 29 / 43

Filtr SAX przykład public class L i c z b y F i l t r extends XMLFilterImpl { private boolean czyprzepuszczac = true ; public void characters ( char [ ] ach, i n t astart, i n t alength ) throws SAXException { i f ( czyprzepuszczac ) super. characters ( ach, astart, alength ) ; } public void endelement ( S t r i n g auri, S t r i n g alocalname, S t r i n g aname) throws SAXException { i f ( czyprzepuszczac ) super. endelement ( auri, alocalname, aname ) ; i f ( " grupa ". equals (aname ) ) czyprzepuszczac = true ; } public void startelement ( S t r i n g auri, S t r i n g alocalname, S t r i n g aname, A t t r i b u t e s a t t s ) throws SAXException { i f ( " grupa ". equals (aname) && " nie ". equals ( a t t s. getvalue ( " wazne " ) ) ) czyprzepuszczac = false ; i f ( czyprzepuszczac ) super. startelement ( auri, alocalname, aname, a t t s ) ; } }

Model strumieniowy (pull parsing) Model strumieniowy (StAX) Alternatywa dla modelu zdarzeniowego: aplikacja "wyciaga" kolejne zdarzenia z parsera, przetwarzanie kontrolowane przez aplikację, a nie parser, parser działa podobnie jak iterator, kursor lub strumień danych, Zachowane cechy modelu SAX: duża wydajność, możliwość przetwarzania dowolnie dużych dokumentów. Standaryzacja: Common XmlPull API, Java Community Process, JSR 173: Streaming API for XML. Patryk Czarnik 10 Programming XML 2010/11 31 / 43

Model strumieniowy (pull parsing) Model strumieniowy (StAX) Alternatywa dla modelu zdarzeniowego: aplikacja "wyciaga" kolejne zdarzenia z parsera, przetwarzanie kontrolowane przez aplikację, a nie parser, parser działa podobnie jak iterator, kursor lub strumień danych, Zachowane cechy modelu SAX: duża wydajność, możliwość przetwarzania dowolnie dużych dokumentów. Standaryzacja: Common XmlPull API, Java Community Process, JSR 173: Streaming API for XML. Patryk Czarnik 10 Programming XML 2010/11 31 / 43

Model strumieniowy (pull parsing) Model strumieniowy (StAX) Alternatywa dla modelu zdarzeniowego: aplikacja "wyciaga" kolejne zdarzenia z parsera, przetwarzanie kontrolowane przez aplikację, a nie parser, parser działa podobnie jak iterator, kursor lub strumień danych, Zachowane cechy modelu SAX: duża wydajność, możliwość przetwarzania dowolnie dużych dokumentów. Standaryzacja: Common XmlPull API, Java Community Process, JSR 173: Streaming API for XML. Patryk Czarnik 10 Programming XML 2010/11 31 / 43

Model strumieniowy (StAX) Pull parsing korzyści Jeszcze większa wydajność niż w (i tak już wydajnym) modelu SAX, dzięki: możliwości przerwania przetwarzania przed końcem pliku, gdy potrzebujemy z niego tylko część danych, możliwości zmniejszenia liczby kopiowań obiektów typu String, szybszemu filtrowaniu zdarzeń. Możliwość prostej obróbki wielu dokumentów jednocześnie. Bardziej proceduralny styl programowania, co daje: mniej stanów do pamiętania, możliwość użycia rekursji, zwiększone powtórne użycie kodu. Źródło: M. Plechawski, "Nie pozwól się popychać", Software 2.0, 6/2003 Patryk Czarnik 10 Programming XML 2010/11 32 / 43

Model strumieniowy (StAX) Pull parsing korzyści Jeszcze większa wydajność niż w (i tak już wydajnym) modelu SAX, dzięki: możliwości przerwania przetwarzania przed końcem pliku, gdy potrzebujemy z niego tylko część danych, możliwości zmniejszenia liczby kopiowań obiektów typu String, szybszemu filtrowaniu zdarzeń. Możliwość prostej obróbki wielu dokumentów jednocześnie. Bardziej proceduralny styl programowania, co daje: mniej stanów do pamiętania, możliwość użycia rekursji, zwiększone powtórne użycie kodu. Źródło: M. Plechawski, "Nie pozwól się popychać", Software 2.0, 6/2003 Patryk Czarnik 10 Programming XML 2010/11 32 / 43

Model strumieniowy (StAX) Pull parsing korzyści Jeszcze większa wydajność niż w (i tak już wydajnym) modelu SAX, dzięki: możliwości przerwania przetwarzania przed końcem pliku, gdy potrzebujemy z niego tylko część danych, możliwości zmniejszenia liczby kopiowań obiektów typu String, szybszemu filtrowaniu zdarzeń. Możliwość prostej obróbki wielu dokumentów jednocześnie. Bardziej proceduralny styl programowania, co daje: mniej stanów do pamiętania, możliwość użycia rekursji, zwiększone powtórne użycie kodu. Źródło: M. Plechawski, "Nie pozwól się popychać", Software 2.0, 6/2003 Patryk Czarnik 10 Programming XML 2010/11 32 / 43

Model strumieniowy (StAX) StAX (dawniej Sun Java Streaming XML Parser) Standard parserów strumieniowych dla Javy (Sun). Realizacja założeń dokumentu JSR 173, zawarty w JSE 6.0. Najważniejsze interfejsy XMLStreamReader: hasnext(), int next(), int geteventtype(), getname(), getvalue(), getattributevalue(),... XMLEventReader: XMLEvent next(), XMLEvent peek(), XMLEvent: geteventtype(), isstartelement(), ischaracters(),... podinterfejsy StartElement, Characters,... XMLStreamWriter, XMLEventWriter, XMLStreamFilter, XMLEventFilter. Patryk Czarnik 10 Programming XML 2010/11 33 / 43

Model strumieniowy (StAX) StAX (dawniej Sun Java Streaming XML Parser) Standard parserów strumieniowych dla Javy (Sun). Realizacja założeń dokumentu JSR 173, zawarty w JSE 6.0. Najważniejsze interfejsy XMLStreamReader: hasnext(), int next(), int geteventtype(), getname(), getvalue(), getattributevalue(),... XMLEventReader: XMLEvent next(), XMLEvent peek(), XMLEvent: geteventtype(), isstartelement(), ischaracters(),... podinterfejsy StartElement, Characters,... XMLStreamWriter, XMLEventWriter, XMLStreamFilter, XMLEventFilter. Patryk Czarnik 10 Programming XML 2010/11 33 / 43

StAX przykład (1) Models Model strumieniowy (StAX) Program private s t a t i c XMLStreamReader freader ; public void run ( S t r i n g [ ] args ) { i n t r e s u l t = 0; XMLInputFactory f a c t o r y = XMLInputFactory. newinstance ( ) ; freader = f a c t o r y. createxmlstreamreader (new FileInputStream ( args [ 0 ] ) ) ; while ( freader. hasnext ( ) ) { i n t eventtype = freader. next ( ) ; i f ( eventtype == XMLStreamConstants. START_ELEMENT) { i f ( " group ". equals ( freader. getlocalname ( ) ) ) { S t r i n g a t t r V a l = freader. g e t A t t r i b u t e V a l u e ( null, " important " ) ; i f ( " yes ". equals ( a t t r V a l ) ) { r e s u l t += this. processgroup ( ) ; } } } } freader. close ( ) ; System. out. p r i n t l n ( " Result : " + r e s u l t ) ; } Patryk Czarnik 10 Programming XML 2010/11 34 / 43

StAX przykład (2) Models Model strumieniowy (StAX) Metoda processgroup private i n t processgroup ( ) throws XMLStreamException { i n t r e s u l t = 0; } while ( freader. hasnext ( ) ) { i n t eventtype = freader. next ( ) ; switch ( eventtype ) { case XMLStreamConstants. START_ELEMENT : i f ( " l ". equals ( freader. getlocalname ( ) ) ) { S t r i n g v a l = freader. getelementtext ( ) ; r e s u l t += I n t e g e r. p a r s e I n t ( v a l ) ; } break ; case XMLStreamConstants.END_ELEMENT : i f ( " group ". equals ( freader. getlocalname ( ) ) ) { return r e s u l t ; } break ; } } return r e s u l t ; Patryk Czarnik 10 Programming XML 2010/11 35 / 43

Which model to choose? (1) Comparison Document tree in memory: small documents (must fit in memory) concurrent access to many nodes creating and editing document "in place" Generyczny model dokumentu (np. DOM): nieznana/niedoprecyzowana struktura dokumentów, dopuszczalna niższa efektywność. Wiazanie XML (np. JAXB): ustalona i znana struktura dokumentu (Schema/DTD), zapisywanie do XML obiektów z aplikacji (np. wymiana danych). Patryk Czarnik 10 Programming XML 2010/11 36 / 43

Which model to choose? (1) Comparison Document tree in memory: small documents (must fit in memory) concurrent access to many nodes creating and editing document "in place" Generyczny model dokumentu (np. DOM): nieznana/niedoprecyzowana struktura dokumentów, dopuszczalna niższa efektywność. Wiazanie XML (np. JAXB): ustalona i znana struktura dokumentu (Schema/DTD), zapisywanie do XML obiektów z aplikacji (np. wymiana danych). Patryk Czarnik 10 Programming XML 2010/11 36 / 43

Which model to choose? (1) Comparison Document tree in memory: small documents (must fit in memory) concurrent access to many nodes creating and editing document "in place" Generyczny model dokumentu (np. DOM): nieznana/niedoprecyzowana struktura dokumentów, dopuszczalna niższa efektywność. Wiazanie XML (np. JAXB): ustalona i znana struktura dokumentu (Schema/DTD), zapisywanie do XML obiektów z aplikacji (np. wymiana danych). Patryk Czarnik 10 Programming XML 2010/11 36 / 43

Which model to choose? (2) Comparison Processing node by node potentially large documents relatively simple, local operations efficiency is the key factor Model zdarzeniowy (np. SAX): filtrowanie zdarzeń, asynchroniczne napływanie zdarzeń, kilka rodzajów przetwarzania podczas jednego czytania dokumentu. Przetwarzanie strumieniowe (np. StAX): koniec przetwarzania po wystapieniu poszukiwanych danych, przetwarzanie zdarzenia zależy od kontekstu (np. od tego, czy jesteśmy wewnatrz pewnego elementu), przetwarzanie równolegle więcej niż jednego pliku. Patryk Czarnik 10 Programming XML 2010/11 37 / 43

Which model to choose? (2) Comparison Processing node by node potentially large documents relatively simple, local operations efficiency is the key factor Model zdarzeniowy (np. SAX): filtrowanie zdarzeń, asynchroniczne napływanie zdarzeń, kilka rodzajów przetwarzania podczas jednego czytania dokumentu. Przetwarzanie strumieniowe (np. StAX): koniec przetwarzania po wystapieniu poszukiwanych danych, przetwarzanie zdarzenia zależy od kontekstu (np. od tego, czy jesteśmy wewnatrz pewnego elementu), przetwarzanie równolegle więcej niż jednego pliku. Patryk Czarnik 10 Programming XML 2010/11 37 / 43

Which model to choose? (2) Comparison Processing node by node potentially large documents relatively simple, local operations efficiency is the key factor Model zdarzeniowy (np. SAX): filtrowanie zdarzeń, asynchroniczne napływanie zdarzeń, kilka rodzajów przetwarzania podczas jednego czytania dokumentu. Przetwarzanie strumieniowe (np. StAX): koniec przetwarzania po wystapieniu poszukiwanych danych, przetwarzanie zdarzenia zależy od kontekstu (np. od tego, czy jesteśmy wewnatrz pewnego elementu), przetwarzanie równolegle więcej niż jednego pliku. Patryk Czarnik 10 Programming XML 2010/11 37 / 43

1 Introduction XML in own applications 2 Models Generyczne drzewo dokumentu (DOM) XML binding (JAXB) Model zdarzeniowy (SAX) Model strumieniowy (StAX) Porównanie 3 Obsługa standardów około-xml-owych Walidacja Transformacje

Obsługa standardów około-xml-owych Walidacja Walidacja względem DTD podczas parsowania SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(true); XMLReader reader = factory.newsaxparser().getxmlreader(); reader.setcontenthandler(mojconenthandler); reader.seterrorhandler(mojerrorhandler); reader.parse(args[0]); Patryk Czarnik 10 Programming XML 2010/11 39 / 43

Obsługa standardów około-xml-owych Walidacja Walidacja względem XML Schema SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schemat = schemafactory.newschema(new StreamSource(args[1])); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(false); factory.setschema(schemat); factory.setnamespaceaware(true); XMLReader reader = factory.newsaxparser().getxmlreader(); reader.setcontenthandler(mojconenthandler); reader.seterrorhandler(mojerrorhandler); reader.parse(args[0]); Patryk Czarnik 10 Programming XML 2010/11 40 / 43

Obsługa standardów około-xml-owych Walidacja Walidacja i zapis drzewa DOM SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schemat = schemafactory.newschema(new StreamSource(args[1])); Validator validator = schemat.newvalidator(); validator.validate(new DOMSource(doc)); DOMImplementationLS lsimpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0"); LSSerializer ser = lsimpl.createlsserializer(); LSOutput out = lsimpl.createlsoutput(); out.setbytestream(new FileOutputStream(args[0])); ser.write(doc, out); Patryk Czarnik 10 Programming XML 2010/11 41 / 43

Obsługa standardów około-xml-owych Walidacja Walidacja i zapis drzewa DOM SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schemat = schemafactory.newschema(new StreamSource(args[1])); Validator validator = schemat.newvalidator(); validator.validate(new DOMSource(doc)); DOMImplementationLS lsimpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0"); LSSerializer ser = lsimpl.createlsserializer(); LSOutput out = lsimpl.createlsoutput(); out.setbytestream(new FileOutputStream(args[0])); ser.write(doc, out); Patryk Czarnik 10 Programming XML 2010/11 41 / 43

Obsługa standardów około-xml-owych Transformacje XSLT Transformacje Przekształcenie dokumentów zapisanych w plikach TransformerFactory t r a n s _ f a c t = TransformerFactory. newinstance ( ) ; transformer = t r a n s _ f a c t. newtransformer (new StreamSource ( args [ 2 ] ) ) ; Source src = new StreamSource ( args [ 0 ] ) ; Result res = new StreamResult ( args [ 1 ] ) ; transformer. transform ( src, res ) ; Patryk Czarnik 10 Programming XML 2010/11 42 / 43

Transformacje Obsługa standardów około-xml-owych Transformacje Zastosowanie do zapisu zdarzeń SAX po przefiltrowaniu SAXParserFactory p a r s e r _ f a c t = SAXParserFactory. newinstance ( ) ; XMLReader reader = p a r s e r _ f a c t. newsaxparser ( ). getxmlreader ( ) ; TransformerFactory t r a n s _ f a c t = TransformerFactory. newinstance ( ) ; Transformer transformer = t r a n s _ f a c t. newtransformer ( ) ; XMLFilter f i l t r = new FiltrGrupyWazne ( ) ; f i l t r. setparent ( reader ) ; InputSource doc = new InputSource ( args [ 0 ] ) ; Source src = new SAXSource ( f i l t r, doc ) ; Result res = new StreamResult ( args [ 1 ] ) ; transformer. transform ( src, res ) ; Patryk Czarnik 10 Programming XML 2010/11 43 / 43