Wykorzystanie XML a we własnych aplikacjach

Podobne dokumenty
XML we własnych aplikacjach

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

XML we własnych aplikacjach

SAX2 pakiet org.xml.sax

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

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

XML we własnych aplikacjach

XML in own applications

Kotwasiński Obsługa XMLa z poziomu Javy

XML in own applications

Procesowanie dokumentów XML

Wykorzystywanie parsera DOM w programach Java i PL/SQL

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

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

XML standardy pokrewne

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

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

Obiektowy model dokumentu. Katedra Mikroelektroniki i Technik Informatycznych

Zaawansowane aplikacje WWW - laboratorium

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

Podstawy XML-a. Zaawansowane techniki programowania

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

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

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

Jak wygląda XML? Definiowanie typów dokumentów Część 1. DTD, XML Schema. Struktura logiczna dokumentu XML. Składnia XML. Encje predefiniowane.

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

XML i nowoczesne technologie zarządzania treścią 2007/08

Drzewa DOM. Maciej Zakrzewicz.

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

Programowanie obiektowe

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

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

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

Przykładowy dokument XML

Dokumentacja do API Javy.

Metody dostępu do danych

XML i nowoczesne technologie zarządzania treścią

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

METODY REPREZENTACJI INFORMACJI

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

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

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

Jak wygląda XML? Definiowanie typów dokumentów Część 1. DTD, XML Schema. Struktura logiczna dokumentu XML. Składnia XML. Encje predefiniowane.

29. Poprawność składniowa i strukturalna dokumentu XML

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Programowanie obiektowe

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

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Java jako język programowania

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Zaawansowany kurs języka Python

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

Programowanie obiektowe zastosowanie języka Java SE

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Programowanie współbieżne i rozproszone

Programowanie obiektowe - 1.

Wielowarstwowe aplikacje internetowe. Przetwarzanie XML. Autor wykładu: Maciej Zakrzewicz. Przetwarzanie XML

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

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

Programowanie obiektowe

Plan dzisiejszego wykładu. Narzędzia informatyczne w językoznawstwie. XML - Definicja. Zalety XML

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

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

Java: interfejsy i klasy wewnętrzne

1 Wprowadzenie do J2EE

Programowanie obiektowe

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

Programowanie obiektowe

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

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

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

Wykład 8: klasy cz. 4

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

Szablony funkcji i szablony klas

Biblioteki dzielone, XML i readline

Czym są właściwości. Poprawne projektowanie klas

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

Builder (budowniczy) Cel: Przykład:

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

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

Programowanie Obiektowe GUI

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Programowanie Komponentowe WebAPI

Model semistrukturalny

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

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

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Typy przetwarzania. Przetwarzanie zcentralizowane. Przetwarzanie rozproszone

Programowanie obiektowe

Podstawy i języki programowania

Transkrypt:

2 grudnia 2004 Wykorzystanie XML a we własnych aplikacjach Patryk Czarnik (na podstawie wykładu Szymona Zioło)

Modele dostępu do dokumentów XML Pozwalają programistom na dostęp do zawartości dokumentów XML na wysokim poziomie: korzystamy z abstrakcyjnych obiektów, nie troszczymy się o analizę leksykalną i składniową. Podstawowym składnikiem implementacji każdego modelu jest parser: analizuje dokument XML i udostępnia jego zawartość w postaci abstrakcyjnego modelu, dokonuje analizy leksykalnej i składniowej, sprawdza poprawność strukturalną (tylko parser walidujący). Po co abstrakcyjne modele: jednolity sposób programowania, niezależnie od użytego parsera, możliwość wymiany parsera.

Modele dostępu do XML klasyfikacja Klasyfikacja najpopularniejszych modeli programistycznych. Dokument w całości wczytywany do pamięci: uniwersalny interfejs programistyczny, przykład: DOM; interfejs zależny od typu dokumentu, przykład: JAXB. Dokument przetwarzany węzeł po węźle: model zdarzeniowy (push parsing), przykład: SAX; przetwarzanie strumieniowe (pull parsing), przykład: SJSXP.

Dokument w pamięci, interfejs uniwersalny Dokument jest reprezentowany przez drzewiastą strukturę danych. Cechy charakterystyczne: cały dokument wczytany do pamięci, jeden zestaw typów/klas i funkcji/metod dla wszystkich dokumentów. Możliwe operacje: czytanie dokumentu do pamięci (np. z pliku), zapis dokumentu (np. do pliku), chodzenie do drzewie dokumentu, odczyt wartości, dowolna modyfikacja struktury i wartości, tworzenie nowych dokumentów.

Document Object Model (DOM) Rekomendacja W3C, standard niezależny od języka programowania. Teoretyczny model dokumentu + interfejs programistyczny (IDL). Części składowe: DOM Level 1 (październik 1998): podstawowe metody dostępu do struktury dokumentu. DOM Level 2 (listopad 2000): nowe cechy XML a, np. przestrzenie nazw, Views "widoki" dokumentu po zastosowaniu stylów CSS, Events obsługa zdarzeń, Style manipulowanie arkuszami stylów, Traversal and Range "podróżowanie" po dokumencie XML. DOM Level 3 (kwiecień 2004): Load and Save ładowanie i zapisywanie dokumentu, Validation dostęp do definicji struktury dokumentu (DTD), XPath dostęp do węzłów DOM przez wyrażenia XPath.

DOM Core Bazowa cześć specyfikacji DOM. Umożliwia: budowanie dokumentów, nawigację po strukturze dokumentów, dodawanie elementów i atrybutów, modyfikacje elementów i atrybutów, usuwanie elementów/atrybutów i ich zawartości. Wady: pamięciożerność, niska efektywność, skomplikowany model dostępu do węzłów.

Drzewo DOM Teoretyczny model dokumentu. Różnice (niektóre) w stosunku do XPath: nieprzezroczyste sekcje CDATA, referencje do encji jako węzły, dostęp do DTD (tylko do niektórych deklaracji, tylko do odczytu). <?xml version="1.0"?> <wiersz> <autor>william Shakespeare </autor> <tytul>sonet 102</tytul> <zwrotka> <wers>...</wers>... </zwrotka> </wiersz> <autor> <wiersz> <tytul> <zwrotka> William Shakespeare Sonet 102 <wers>

DOM najważniejsze interfejsy Node Document Element Comment Attr Text Processing Instruction CDATA Section

Interfejs Node Dostęp do zawartości: getattributes() getchildnodes() getfirstchild() getlastchild() getnextsibling() getprevioussibling() getnodename() getnodevalue() getnodetype() getownerdocument() getparentnode() haschildnodes() Manipulacja zawartością: appendchild(node) insertbefore(node, Node) removechild(node) replacechild(node, Node) setnodevalue(string) setnodename(string) Klonowanie: clonenode(boolean)

Przykład Przykładowy dokument: <?xml version= 1.0?> <liczby> <grupa wazne= tak > <l>52</l><s>...</s> </grupa> <grupa wazne= nie > <l>5</l><l>21</l> </grupa> <grupa wazne="tak"> <s>9</s><l>12</l> </grupa> </liczby> DTD: <!ELEMENT liczby (grupa*)> <!ELEMENT grupa ((l s)*)> <!ATTLIST grupa wazne (tak nie) #REQUIRED> <!ELEMENT l (#PCDATA)> <!ELEMENT s (#PCDATA)> Zadanie: Zsumować wartości elementów l zawartych w elementach grupa o atrybucie wazne równym tak.

Przykład rozwiązanie w DOM (1) int result = 0; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setvalidating(true); DocumentBuilder builder = factory.newdocumentbuilder(); Document doc = builder.parse(args[0]); Node cur = doc.getfirstchild(); while(cur.getnodetype()!= Node.ELEMENT_NODE) cur = cur.getnextsibling(); cur = cur.getfirstchild(); while(cur!= null) { if(cur.getnodetype() == Node.ELEMENT_NODE) { String attval = cur.getattributes(). getnameditem("wazne").getnodevalue(); if(attval.equals("tak")) { result += processgroup(cur); } cur = cur.getnextsibling(); } System.out.println("Result: "+result);

Przykład rozwiązanie w DOM (2) private static int processgroup(node group) { int result = 0; } Node cur = group.getfirstchild(); while(cur!= null) { } if(cur.getnodetype() == Node.ELEMENT_NODE && cur.getnodename().equals("l")) { StringBuffer buf = new StringBuffer(); Node child = cur.getfirstchild(); while(child!= null) { if(child.getnodetype() == Node.TEXT_NODE) buf.append(child.getnodevalue()); child = child.getnextsibling(); } result += Integer.parseInt(buf.toString());; } cur = cur.getnextsibling(); return result;

DOM zastosowania W DOM można programować na dwa zasadnicze sposoby: używając jedynie interfejsu Node; atrybut nodetype określa typ węzła a atrybuty takie jak childnodes, nodename, nodevalue dają dostęp do jego zawartości; używając interfejsów specyficznych dla węzłów różnego typu (Document, Element, Text); mamy wtedy do dyspozycji więcej specyficznych metod, takich jak getelementsbytagname(string), getattribute(string). Inne zastosowania DOM: interfejs programistyczny do dokumentów HTML, zalecany sposób dostępu do dokumentów przez skrypty działające w przeglądarkach internetowych (JavaScript, ECMA Script).

Wiązanie XML idea Dokumenty XML a obiekty (np. Javy): DTD/schemat odpowiada definicji klasy, dokument (instancja schematu) odpowiada obiektowi (instancji klasy). Pomysł: automatyczne generowanie klas z DTD/schematów. Różnice w stosunku do modelu generycznego (np. DOM): zestaw typów/klas i funkcji/metod zależy od typu dokumentu, struktura mniej kosztowna pamięciowo, intuicyjny interfejs dostępu do zawartości, modyfikacja struktury i wartości tylko w ramach tego samego typu dokumentu. Implementacje: JAXB (Sun), Castor (Exolab), Dynamic XML (Object Space).

Java Architecture for XML Binding (JAXB) Standard Sun a. Wersja 1.0 (styczeń 2003): definicja uniwersalnego fragmentu API, specyfikacja jak schemat dokumentu jest tłumaczony na klasy, wsparcie dla XML Schema (domyślnie), DTD i RelaxNG (jako dodatek), wzorcowa implementacja zawarta m.in. w JWSDP 1.5. (źródło: http://java.sun.com)

JAXB jak używać? Kroki implementacji aplikacji używającej JAXB: przygotowanie schematu dokumentów, kompilacja schematu narzędziem XJC, generuje klasy Javy: interfejsy odpowiadające typom zdefiniowanym w schemacie, klasy implementujące te interfejsy, napisanie samej aplikacji korzystając z: uniwersalnej części API JAXB, interfejsów wygenerowanych przez XJC. Uwaga! Zmiana schematu po napisaniu aplikacji może spowodować konieczność znacznych zmian w kodzie.

Przykład klasy generowane w JAXB (1) Schemat dokumentu: <xsd:element name="liczby"> <xsd:complextype> <xsd:sequence> <xsd:element ref="grupa" minoccurs="0" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> </xsd:element> <xsd:element name="l" type="xsd:integer"/> <xsd:element name="s" type="xsd:string"/> Wygenerowane interfejsy: Liczby rozszerza LiczbyType i Element LiczbyType List getgrupa() L S rozszerza Element BigInteger getvalue() void setvalue(biginteger) rozszerza Element String getvalue() void setvalue(string)

Przykład klasy generowane w JAXB (2) Schemat dokumentu: <xsd:element name="grupa"> <xsd:complextype> <xsd:choice minoccurs="0" maxoccurs="unbounded"> <xsd:element ref="l"/> <xsd:element ref="s"/> </xsd:choice> <xsd:attribute name="wazne"> <xsd:simpletype> <xsd:restriction base="xsd:string"> <xsd:enumeration value="tak"/> <xsd:enumeration value="nie"/> </xsd:restriction> </xsd:simpletype> </xsd:attribute> </xsd:complextype> </xsd:element> Wygenerowane interfejsy: Grupa rozszerza GrupaType i Element GrupaType List getlors() String getwazne() void setwazne(string)

Przykład rozwiązanie w JAXB (1) int result = 0; JAXBContext jc = JAXBContext.newInstance("generated"); Unmarshaller unmarshaller = jc.createunmarshaller(); Liczby doc = (Liczby) unmarshaller.unmarshal(new FileInputStream(args[0])); List grupy = doc.getgrupa(); ListIterator iter = grupy.listiterator(); while(iter.hasnext()) { Grupa grupa = (Grupa)iter.next(); String attval = grupa.getwazne(); if(attval.equals("tak")) { result += processgroup(grupa); } } System.out.println("Result: "+result);

Przykład rozwiązanie w JAXB (2) private static int processgroup(grupa agrupa) { int result = 0; } List elems = agrupa.getlors(); ListIterator iter = elems.listiterator(); while(iter.hasnext()) { Element elem = (Element)iter.next(); } if(elem instanceof L) { L l = (L)elem; result += l.getvalue().intvalue(); } return result;

Model zdarzeniowy idea Model umożliwia programiście napisanie dowolnego kodu, który będzie wykonywany podczas czytania dokumentu: dokument XML jako ciąg zdarzeń (np. początek elementu, węzeł tekstowy, koniec dokumentu,...), programista podaje funkcje/metody, które będą wykonywane w odpowiedzi na zdarzenia różnego typu, parser dokonuje analizy leksykalnej, sprawdza poprawność składniową (opcjonalnie strukturalną) i wykonuje kod programisty w miarę pojawiania się kolejnych zdarzeń. Możliwe realizacje w zależności od języka programowania: funkcje (języki funkcyjne), wskaźniki do funkcji (C), obiekt ( handler ) zawierający zestaw metod wykonywanych przy okazji różnych zdarzeń (języki obiektowe).

SAX Simple API for XML Standard odpowiedni dla języków obiektowych, wzorcowe interfejsy zapisane w Javie. Status: 1998: SAX 1.0, 2000: SAX 2.0 najważniejsze rozszerzenia: obsługa przestrzeni nazw, cechy (features) wartości boolowskie, właściwości (properties) dowolne obiekty, zmiany nazw wielu obiektów.

Działanie modelu SAX przykład <?xml version="1.0"?> <wiersz bialy="nie"> <autor> William Shakespeare </autor> </tytul> </wiersz> Parser setdocumenthandler Aplikacja startdocument() startelement("wiersz", [bialy="nie" ]) ignorablewhitespace(spacje) startelement("autor",[]) characters("william...") endelement("autor") ignorablewhitespace(spacje) throw SAXException

SAX2 w Javie pakiet org.xml.sax Interfejsy implementowane przez parser: XMLReader parse, setcontenthandler,... Attributes getlength, getlocalname, getqname, getvalue. Opcjonalny: Locator. Interfejsy implementowane przez użytkownika parsera: ContentHandler zdarzenia: characters, ignorablewhitespace, startdocument, enddocument, startelement, endelement, processinginstruction, setdocumentlocator. ErrorHandler, DTDHandler, EntityResolver.

SAX2 w Javie pakiet org.xml.sax Standardowa klasa: org.xml.sax.inputsource może pobierać dane z InputStream, Reader, String. Wyjątek: SAXException podnoszony w przypadku wystąpienia błędu. Klasy pomocnicze (pakiet org.xml.sax.helpers): DefaultHandler implementujemy podklasy tej klasy, XMLReaderFactory, AttributesImpl, LocatorImpl.

SAX kroki implementacji Tworzymy klasę implementującą interfejs ContentHandler, opcjonalnie tworzymy klasy implementujące 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. Schemat aplikacji: Pobieramy obiekt XMLReader z fabryki. Rejestrujemy stworzoną klasę w parserze (XMLReader) metodami setcontenthandler, seterrorhandler itp. Wywołujemy metodę parse.

Przykład rozwiązanie w SAX (1) private static class MyHandler extends DefaultHandler { private int result = 0, state = cstate_out; private StringBuffer buf; public int getresult() { return result; } public void startelement( String uri, String localname, String qname, Attributes atts){ public void endelement(string uri, String localname, String qname){ if(qname.equals("grupa")) { String attrval = atts.getvalue("wazne"); if(attrval.equals("tak")) state = ST_Group; } else if(qname.equals("l")) { if(state == ST_Group) { state = ST_L; buf = new StringBuffer(); } } } if(qname.equals("grupa")) { if(state == ST_Group) state = ST_Out; } else if(qname.equals("l")) { if(state == ST_L) { state = ST_Group; result += Integer.parseInt( fbuf.tostring()); } } }

Przykład rozwiązanie w SAX (2) public void characters(char[] ch, int start, int length) { } if(state == ST_L) buf.append(ch, start, length); } /* MyHandler */ W aplikacji: SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(true); SAXParser parser = factory.newsaxparser(); MyHandler handler = new MyHandler(); parser.parse(args[0], handler); System.out.println("Result: "+handler.getresult());

Filtry SAX Implementują interfejs XMLFilter, a także (pośrednio) XMLReader. Zachowują się jak parser, ale ich źródłem danych jest inny XMLReader (parser lub filtr), można je łączyć w łańcuchy. Domyślna implementacja: XMLFilterImpl: przepuszcza wszystkie zdarzenia, implementuje interfejsy ContentHandler, ErrorHandler itp. Filtry pozwalają na: filtrowanie zdarzeń, zmianę danych (a nawet struktury) dokumentu przed wysłaniem zdarzenia dalej, przetwarzanie dokumentu przez wiele modułów podczas jednego parsowania.

Przetwarzanie strumieniowe pull parsing Alternatywa dla modelu zdarzeniowego: aplikacja "wyciąga" 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.

SAX a pull parsing SAX: Pull parsing: aplikacja mycontenthandler parser aplikacja parser parse() next() next() next() next()

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

Sun Java Streaming XML Parser Standard parserów strumieniowych dla Javy promowany przez Sun a. Realizacja założeń dokumentu JSR 173, wersja EA zawarta w JWSDP 1.5. 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.

Przykład rozwiązanie w SJSXP (1) int result = 0; boolean count = false; XMLInputFactory factory = XMLInputFactory.newInstance(); factory.setproperty("javax.xml.stream.isvalidating", Boolean.TRUE); XMLStreamReader reader = factory.createxmlstreamreader(new FileInputStream(args[0])); while(reader.hasnext()) { int eventtype = reader.next(); } switch(eventtype) { /***/ } reader.close(); System.out.println("Result: "+result);

Przykład rozwiązanie w SJSXP (2) /***/ : case XMLStreamConstants.START_ELEMENT : if(reader.getlocalname().equals("grupa")) { String attrval = reader.getattributevalue(null,"wazne"); count = attrval.equals("tak"); } else if(reader.getlocalname().equals("l")) { } break; if(count) { String val = reader.getelementtext(); result += Integer.parseInt(val); } case XMLStreamConstants.END_ELEMENT : if(reader.getlocalname().equals("grupa")) { count = false; } break; }

Jaki model wybrać? Cechy problemu przemawiające za danym modelem programistycznym. Budowa drzewa dokumentu (cechy wspólne): nieduże dokumenty (muszą mieścić się w pamięci), operacje wymagające jednoczesnego dostępu do wielu węzłów, tworzenie, edycja i zapisywanie dokumentów. Generyczny model dokumentu (np. DOM): nieznana/niedoprecyzowana struktura dokumentów, dopuszczalna niższa efektywność. Wiązanie XML (np. JAXB): ustalona i znana struktura dokumentu (Schema/DTD), zapisywanie do XML obiektów z aplikacji (np. wymiana danych).

Jaki model wybrać? Przetwarzanie węzeł po węźle (cechy wspólne): potencjalnie duże dokumenty, stosunkowo proste, lokalne operacje, ważna efektywność. Model zdarzeniowy (np. SAX): filtrowanie zdarzeń, kilka rodzajów przetwarzania podczas jednego czytania dokumentu. Przetwarzanie strumieniowe (np. SJSXP): koniec przetwarzania po wystąpieniu poszukiwanych danych, przetwarzanie zdarzenia zależy od kontekstu (np. od tego, czy jesteśmy wewnątrz pewnego elementu), przetwarzanie równolegle więcej niż jednego pliku.

XML i Java Ideologia: Java umożliwia uruchamianie raz napisanych programów na wielu platformach sprzętowych/systemowych, XML stanowi międzyplatformowy nośnik danych. Praktyka: wsparcie dla Unicode i różnych standardów kodowania, wsparcie dla XML już w bibliotece standardowej (JAXP), wiele narzędzi wspierających i używających XML w Javie: JAXB, SJSXP, JAXR (rejestry w XML), XML Signature (podpis elektroniczny), JAX RPC, SOAP (programowanie rozproszone).

JAXP Java API for XML Processing: definicja interfejsów, za pomocą których programiści mogą przetwarzać XML we własnych aplikacjach, wzorcowa implementacja, możliwość podmiany implementacji wybranego modułu (np. parsera). Wersja 1.3 (wrzesień 2004), zawarta w J2SE (1.)5.0: parsery (DOM Level 3 i SAX 2), procesor XSLT 1.0, ewaluator XPath 1.0, walidator XMLSchema i DTD. W kolejnych wersjach zapewne: XQuery, parsowanie strumieniowe (?).

Przegląd parserów XML (1) Xerces http://xml.apache.org SAX 2, DOM Level 3 (eksperymentalnie Load and Save), Java, C++, Perl, jako komponent COM. Expat (C) i XP (Java) http://www.jclark.com/xml/ model zdarzeniowy (w XP zgodny z SAX), parsery niewalidujące. LibXML (C) http://www.xmlsoft.org/ model zdarzeniowy (SAX w wersji bez obiektów), czytanie strumieniowe, generyczny model drzewiasty (niezgodny z DOM).

Przegląd parserów XML (2) Oracle XML Parser http://www.oracle.com/technology/tech/xml/ różne modele dostępu, m.in. SAX, DOM, XPath, Java, C, C++, PL/SQL. Microsoft XML Core Servises (MSXML 4.0) http://msdn.microsoft.com/xml/ SAX, DOM, Schema Object Model, komponent COM można korzystać m.in. w: C++, VB, Java, Perl, Python, JavaScript, ECMAScript, VBScript. XML w.net: SAX, DOM, XPath, pull parsing.

Referencje (WWW) XML w Javie (m.in. JAXP, JAXB): http://java.sun.com/xml/ SAX: http://www.saxproject.org/ DOM: http://www.w3.org/dom/ Common API for XML Pull Parsing http://www.xmlpull.org/ IBM alphaworks: http://www.alphaworks.ibm.com Odnośniki do istniejących narzędzi i bibliotek, artykuły dla programistów: http://www.xml.com/ http://xml.coverpages.org/

Referencje (czasopisma) Paweł Gajda, SAX i DOM, czyli XML w naszych aplikacjach www.empolis.pl Osiągnięcia Archiwum publikacji Software 2.0, nr 6/2001, Wydawnictwo Software Tomasz Brauncajs, JAXB i Castor wiązanie XML a w Javie Software 2.0, nr 6/2002, Wydawnictwo Software Michał Plechawski, Nie pozwól się popychać Software 2.0, nr 6/2003, Wydawnictwo Software Patryk Czarnik, Alternatywne źródła zdarzeń SAX Software 2.0, nr 6/2004, Wydawnictwo Software