Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml



Podobné dokumenty
Java a XML. 10/26/09 1/7 Java a XML

NSWI096 - INTERNET JavaScript

}w!"#$%&'()+,-./012345<ya

20. Projekt Domácí mediotéka

X36DSV 3. cvičení. XML (extensible Markup Language) JavaScript. AJAX (Asynchronous JavaScript and XML) X36DSV. 2007/10 ver.2.0 1

API pro práci s XML. Jirka Kosek. Poslední modifikace: $Date: 2014/12/17 17:15:28 $ Copyright Jiří Kosek

Obsah prezentace. Co je to XML? Vlastnosti. Validita

Generické programování

GUI. Systémová integrace pro desktopové aplikace

Správnost XML dokumentu

Syntaxe XML XML teorie a praxe značkovacích jazyků (4IZ238)

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Na tomto místě bude oficiální zadání vaší práce

Úvod do programovacích jazyků (Java)

RMI Remote Method Invocation

PŘETĚŽOVÁNÍ OPERÁTORŮ

IRAE 07/08 Přednáška č. 1

Programování v Javě I. Leden 2008

Tvorba informačních systémů

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Technologie JavaBeans

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Programování v Javě I. Únor 2009

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Tvorba informačních systémů

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

UJO Framework. revoluční architektura beans. verze

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Kód, který se nebude často měnit

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dědění, polymorfismus

X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

PRG036 Technologie XML

Úvod Jednoduchá komunikace Sockety Konec. Programování v C# Síťová komunikace. Petr Vaněček 1 / 33

Programování v C++ 1, 5. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základy objektové orientace I. Únor 2010

Úvod do databázových systémů B

Teoretické minimum z PJV

Java Výjimky Java, zimní semestr

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Rozhraní pro práci s XML dokumenty. Roman Malo

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Dědičnost (inheritance)

Seminář Java II p.1/43

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

Remote Method Invocation RMI

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

Podpora XML v.net. Podpora XML v.net. nezávislý publicista. Jirka Kosek.

XML a DTD. <!DOCTYPE kořenový_element [deklarace definující vlastnosti jednotlivých elementů a atributů]> externí deklarace:

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

PB161 Programování v jazyce C++ Přednáška 8

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Jazyk C++ II. Výjimky

Obsah přednášky. XML DOM SAX XPath XSL transformace 1/46

Jazyk C# (seminář 6)

ios Cvičení RSS čtečka

Práce se soubory opakování

Virtuální metody - polymorfizmus

JAVA. Java Management Extensions JMX

Vývoj Internetových Aplikací

Python XML a Web 1 PGS

Více o konstruktorech a destruktorech

Výčtový typ strana 67

Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky DIPLOMOVÁ PRÁCE

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 3)

NPRG031 Programování II 1 / :25:46

Tvorba informačních systémů

NMIN201 Objektově orientované programování 1 / :36:09

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Programátorská příručka

Distribuované systémy a výpočty (02)

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Jemný úvod do spracovania XML

typová konverze typová inference

Abstraktní datové typy: zásobník

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Programový generátor trendů Václav Bárta

24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML.

Iterator & for cyklus

Analýza dat a modelování. Speciální struktury

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

11. Dědičnost. Dědičnost strana 103

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

JSON API pro zjišťování cen MtG karet

Source Defender. PPJ semestrální projekt. Martin Přeták, ARI

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Události. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

OGC GeoPackage nový formát pro výměnu prostorových dat. Jáchym Čepický OpenGeoLabs s.r.o. GIVS 2018

JavaBeans API umožňuje psaní softwarových komponent v programovacím jazyce Java. Komponenta je obecně nějakou částí programového kódu, které je

Jakub Čermák Microsoft Student Partner

Transkript:

Rozhraní SAX, SAX vs. SAX2 Jaroslav Ciml

Použití SAX - připomenutí Vytvoření instance parseru XMLReader xmlreader = XMLReaderFactory.createXMLReader(); Registrace handleru xmlreader.setcontenthandler( contenthandler); Parsování xmlreader.parse(inputsource); Třída InputSouce zapouzdřuje různé způsoby předání XML dokumentu ( InputStream, Reader, systemid)

Atributy Zpracování atrubut ů zajišťuje ContentHandler jako reakci na událost startelement void startelement(string uri, String localname, String qname, Attributes atts) Rozhraní Attributes reprezentuje množinu všech atribut ů uvedených v otevíracím tagu elementu 3 možnosti přístupu k jednotlivým atributům pomocí indexu pomocí jména atributu (raw name) pomocí namespace a lokálního jména atributu

Atributy - příklad Atribut bez namespace <lastname lang="en">smith</lastname> kvalifikované jméno (raw, prefixed, qualified name) namespace (uri) lokální jméno (local name) Atribut s namespace lang prázdný řetězec lang <rootelem xmlns:ns= http://www.mff.cuni.cz/namespace > <lastname ns:lang="en">smith</lastname> </rootelem> kvalifikované jméno ns:lang namespace (uri) http://www.mff.cuni.cz/namespace lokální jméno lang

Metody rozhraní Attributes Přístup přes index int getlength() String getqname(int index) String geturi(int index) String getlocalname(int index) String getvalue(int index) Přístup přes jméno atributu String getvalue(string qname) Přístup přes namespace a lokální jméno String getvalue(string uri, String localname)

Atributy - dodatky Pokud nemá parser zapnutou podporu namespaces, je k dispozici pouze kvalifikované jméno Přístup přes kvalifikované jméno nemusí fungovat správn ě, pokud nemá parser nastavenou vlastnost xmlreader.setfeature( http://xml.org/sax/features/namespace-prefixes, true); Rozhraní Attributes existuje až od SAX 2.0, v SAX 1.0 rozhraní AttributeList bez podpory namespaces (pouze raw names)

Handlery U parseru lze zaregistrovat 4 handlery třídy implementující následující rozhraní ContentHandler ErrorHandler DTDHandler EntityResolver Všechna rozhraní implementuje třída DefaultHandler (těla všech metod jsou prázdná)

ContentHandler startdocument, enddocument, startelement, endelement characters, ignorablewhitespace Mapování prefixu na namespace void startprefixmapping(string prefix, String uri) void endprefixmapping(string prefix) Příklad <rootelem xmlns:ns= http://www.mff.cuni.cz/namespace > při vstup do elementu (ješt ě před událostí startelement) zavolá parser metodu startprefixmapping( ns, http://www.mff.cuni.cz/namespace )

ContentHandler Pro deklarace <?target data?> se volá void processinginstruction( String target, String data) metoda se nezavolá pro deklaraci xml <?xml version= 1.0?> Lokátor Parser ješt ě před událostí startdocument zavolá metodu void setdocumentlocator(locator locator) Klientský kód si může instanci typu Locator uložit Během parsování dokumentu (mezi událostmi startdocument a enddocument) se lze dotazovat na pozici int getlinenumber() int getcolumnnumber()

ErrorHandler void fatalerror( SAXParseException exception) nezotavitelná chyba (typicky: dokument není dobře formovaný) void error( SAXParseException exception) zotavitelná chyba (typicky: dokument není validní) void warning( SAXParseException exception) Po zpracování události error nebo warning pokračuje parsování dokumentu. Klientský kód může parsování dokumentu ukončit vyhozením výjimky SAXException.

DTDHandler, EntityResolver DTDHandler umožňuje reagovat pouze na neparsované entity a notace <!DOCTYPE document [ <!NOTATION WAV SYSTEM "/usr/local/bin/wave_player"> <!ENTITY music SYSTEM "drop.wav" NDATA WAV> ]> <document> <sound what="music"/> </document> EntityResolver zpracovává externí entity (nap. ř odkaz na externí DTD)

Handlery SAX 1.0 V SAX 1.0 opět chybí podpora namespaces Rozhraní DocumentHandler (místo ContentHandler) používá pouze raw names chybí metody startprefixmapping, endprefixmapping Defaultní implementace handler ů třída HandlerBase (místo DefaultHandler)

Parsery Vytvoření instance parseru XMLReader xmlreader = XMLReaderFactory.createXMLReader(); Registrace handleru xmlreader.setcontenthandler(contenthandler); xmlreader.seterrorhandler(errorhandler); xmlreader.setdtdhandler(dtdhandler); xmlreader.setentityresolver(entityresolver); Parsování xmlreader.parse(inputsource);

Parsery features, properties void setproperty(string name, Object value) nastavuje vlastnosti parseru formou dvojic jméno-hodnota p ř.: nastavení validace podle XML Schema xmlreader.setproperty( http://java.sun.com/xml/jaxp/properties/schemalanguage, http://www.w3.org/2001/xmlschema ); void setfeature(string name, boolean value) zapíná / vypíná vlastnosti parseru p ř.: zapnutí validace některých časov ě náročných podmínek (například omezení unique) xmlreader.setproperty( http://apache.org/xml/features/validation/ + schema-full-checking, true);

Parsery SAX 1.0 Vytvoření instance parseru Parser parser = ParserFactory.makeParser(); Rozhraní Parser nepodporuje namespaces, nepodporuje properties ani features, ke všem setter metodám chybí getter metody Z instance typu Parser lze vytvořit objekt chovající se jako XMLReader a naopak XMLReader xmlreader = new ParserAdapter(parser); Parser parser = new XMLReaderAdapter(xmlReader);

Parsery alternativní přístup Vytvoření továrny SAXParserFactory factory = SAXParserFactory.newInstance(); Na továrn ě lze nastavit setfeature(string name, boolean value) void setvalidating(boolean validating) void setnamespaceaware(boolean awareness) Vytvoření parseru SAXParser saxparser = factory.newparser(); Vzniklý parser v sob ě obsahuje instanci typu Parser i instanci typu XMLReader (dostupné pomocí metod getparser, getxmlreader)

Parsery alternativní přístup Na parseru lze nastavit properties void setproperty(string name, Object value) Spousta variant přetížené metody parse, všechny mají parametry XML dokument (InputStream, InputSource, URI, File) Implementace handler ů ( DefaultHandler, HandlerBase)

Filtry Filtry umožňují změnit události, které se dostávají k obslužným metodám handler ů (nap ř. lze pro každou událost startelement vygenerovat atribut id) Filtry jsou objekty implementující rozhraní XMLFilter interface XMLFilter extends XMLReader Třída XMLFilterImpl je defaultní implementací XMLFilter. Nový filtr se typicky vytvoří zděděním této třídy.

Přidání filtru Obyčejné použití parseru vytvoření instance parseru nastavení handlerů volání metody parse Použití parseru s filtrem vytvoření instance parseru přidání filtru XMLReader filteringxmlreader = new XMLFilterImpl( xmlreader); nastavení handlerů (na objektu filteringxmlreader) volání metody parse (na filteringxmlreader)

Jak funguje XMLFilterImpl XMLFilterImpl si zapamatuje skutečný parser předaný jako parametr konstruktoru XMLFilterImpl si zapamatuje všechny nastavené handlery jako své atributy (dostupné přes metody getcontenthandler,...) Při volání metody parse nejprve XMLFilterImpl zaregistruje u parseru sebe (implementuje všechny handler rozhraní). Poté deleguje na parser volání parse. Metody startelement,... definované třídou XMLFilterImpl pouze delegují volání na uložené handlery. Předpokládá se, že potomci předefinují toto chování.

Zdroje http://xml.apache.org/xerces-j http://www.saxproject.org http://www.cafeconleche.org/books/xmljava