Semistrukturierte Daten

Ähnliche Dokumente
Semistrukturierte Daten. Teil 5: Java API for XML Processing

Inhalt. Parser-Modelle. Aufgaben eines XML-Prozessors. XML-APIs und Java. Idee eines XML-Prozessors (Parsers) VU Semistrukturierte Daten 2

Programmieren II SAX. Beispiel-Schema kontakt.xsd SAX DOM. Dr. Klaus Höppner JAXB. Hochschule Darmstadt SS 2008

XML-Technologien. XML-Parser. Florian Raith Hochschule München Fakultät für Informatik und Mathematik am 04. November 2010

JAVA/XML Das bhv Taschenbuch

XML. extensible Markup Language. Dr. Beatrice Amrhein.

Verarbeitung von XML mit SAX und DOM

XML-Frameworks in verschiedenen Programmiersprachen Proseminar Textkodierung und Auszeichnung

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Klaus Schild, XML Clearinghouse Verarbeitung von XML- Dokumenten

XML - Datei Zugriff mit Java

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Anbindung von XML an OOP

Berner Fachhochschule Software Schule Schweiz JDOM. Beatrice Amrhein. Oktober 06

P A X P A X. Power API for XML. DOM und SAX. PAX : Ideen und Konzepte. Wie PAX funktioniert. Wie PAX angewandt wird. WWW-Links. von Manfred Duchrow

1 Software Engineering 1

XML. M. Löberbauer, T. Kotzmann, H. Prähofer

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

XML-Programmierschnittstellen: SAX, DOM

XML APIs allgemein. XML APIs, DOM und SAX. Erinnerung. Ansprüche an XML APIs. Welche Möglichkeiten bestehen? Vor- und Nachteile

Praktikum aus Softwareentwicklung 2. Java und XML. Java Praktikum SS 2008

5.5. Document Object Model - DOM. Überblick DOM DOM und JAXP Node-Interface Einige Subinterfaces von Node Weitere Interfaces

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

XML Informationsmodelle

Java und XML 2. Java und XML

Auszug aus JAX-WS Folien

11 XML Programmierung

SAX. Seminararbeit im Seminar XML und Datenbanken Sommersemester 2004 Universität Jena. vorgelegt von Stefan Scheidewig

Inhaltsverzeichnis 1. XML in der Praxis: Dokumente kodieren, editieren, parsen und validieren ....??

Repetitorium Informatik (Java)

Ruhr.pm XML-Daten verarbeiten mit XML::LibXML Autor: Datum:

Einstieg in die Informatik mit Java

CARL HANSER VERLAG. Dirk Ammelburger XML. Grundlagen der Sprache und Anwendungen in der Praxis

XML Parser. Ein Überblick XML UND JAVA. In diesem Kapitel Einleitung Streams und Readers

Große Übung Praktische Informatik 1

Übung 1: Object Inspector

1. Einführung. Gliederung. Document Object Model (DOM) DOM Die Spezifikation (1) Level 2 HTML Specification. 1. Einführung. 2.

Der MyCoRe-URI-Resolver

Analyse und Modellierung von Informationssystemen

Distributed Computing Group

XML-Parser. Markus Luczak-Rösch Freie Universität Berlin Institut für Informatik Netzbasierte Informationssysteme

Einführung in ActionScript

Programmieren in Java

Remote Method Invocation

Programmentwicklung ohne BlueJ

Probeklausur: Programmierung WS04/05

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Ausdrucksbäume in verschiedenen Darstellungen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Modell/Metamodell. Generated Source Code. Generator. Model. Fakultät für Informatik und Wirtschaftsinformatik MDSD - SS 2014

Vererbung & Schnittstellen in C#

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

XML-Verarbeitung (VER) Lernziele

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Einführung in die Programmierung

XML-Verarbeitung mit Java

Variablen manipulieren per JDI

Dynamische Websites mit XML und PHP4

Javakurs zu Informatik I. Henning Heitkötter

Java Beans.

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Java: Kapitel 9. Java und XML. Programmentwicklung WS 2008/2009. Holger Röder

XML Verarbeitung mit einer in Haskell eingebetteten DSL. Manuel Ohlendorf (xi2079)

X-Technologien. XML and Friends. Jörn Clausen 9. Juli 2001

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Java Metadata Interface. Thorsten Pivl

Softwareschnittstellen

BiPRO und PHP Marcel Maaß

Einführung in den NetBeans Profiler

XML auf J2ME MIDP. PI-Data, Peter Rudolph (C) 2004 PI-Data Peter Rudolph,

Vorbereitungen Download. AVO-Übung 6. Beispiel. Slice. Varianten u.a. für Linux, Windows, OS X ICE-Dokumentation ICE-Binaries (inkl.

Asynchrone Webservices mit Axis 1.x in Java

Java für C++ Programmierer

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

1 Polymorphie (Vielgestaltigkeit)

2.2 Prozesse in Java

5. Threads, Serverprozesse und Benachrichtigungen

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Java Einführung Methoden in Klassen

Vorkurs C++ Programmierung

Einstieg in die Informatik mit Java

Programmierkurs Java

Objektorientierte Programmierung

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Skalierbare Webanwendungen mit Python und Google App Engine

... MathML XHTML RDF

C# im Vergleich zu Java

Relationen-Algebra und Persistenz Teil I

Datenbankanwendungsprogrammierung Crashkurs Java

Gebundene Typparameter

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Ferhat Ayaz. XML mit C++

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Handbuch für die Erweiterbarkeit

6 Speicherorganisation

1 Hashing und die Klasse String

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Einführung in die Informatik

Transkript:

Teil 6: SAX Semistrukturierte Daten Sommersemester 2007 6.1. Überblick 6.2. ContentHandler 6.3. weitere Event Handler 6.4. XMLReader 6.5. Benutzung von SAX in JAXP 6.6. SAX-Filter 6.7. Epilog

6.1. Überblick Entwicklung von SAX Funktionsweise von SAX XMLReader 2

Entwicklung von SAX SAX: Simple API for XML keine W3C Recommendation, aber ein de-facto Standard: http://www.saxproject.org/ Entwickelt von XML-Entwicklern ("jeder" kann mitmachen über die Mailing List xml-dev@w3.org) Plattform- und Programmiersprachen-unabhängig (auch wenn SAX ursprünglich für Java entwickelt wurde) SAX Versionen: SAX 1.0: entstanden auf Initiative von Peter Murray-Rust (mit dem Ziel, mehrere ähnliche aber inkompatible Java XML-APIs zusammenzuführen), im Mai 1998 freigegeben. SAX 2.0: erweitert um Namespace-Unterstützung; führte zu inkompatibler Erweiterung von SAX 1.0 3

Funktionsweise von SAX (1) 4

Funktionsweise von SAX (2) Applikation registriert callback Funktionen beim SAX-Parser (d.h.: "XMLReader"). Applikation startet SAX-Parser. SAX-Parser durchläuft das XML-Dokument einmal sequentiell. Parser erkennt Events (syntaktische Einheiten) beim Analysieren des XML-Dokuments. Parser ruft für jedes Event die entsprechende Callback Funktion auf, die die Applikation bereitstellt. Diese Callback Funktionen sind auf 4 Event Handler aufgeteilt: ContentHandler, ErrorHandler, DTDHandler, EntityResolver Der Speicherbedarf des SAX-Parsers ist konstant! (d.h.: unabhängig von der Größe des XML-Dokuments) 5

XML Reader Ist der eigentliche SAX-Parser, d.h.: liest das XML-Dokument und ruft die callback Funktionen auf. Erlaubt das Setzen/Auslesen bestimmter Properties/Features: setfeature, setproperty, getfeature, getproperty Benutzer registriert die Event Handler (mit den callback Funktionen): setcontenthandler, setdtdhandler, setentityresolver, seterrorhandler Analog dazu get-methoden für die Event Handler: getcontenthandler, getdtdhandler, etc. Methode zum Anstoßen des Parsers: parse 6

6.2. ContentHandler Überblick einige ContentHandler-Methoden im Detail: Dokument-Verarbeitung Element-Verarbeitung Attributes Interface Text-Verarbeitung Locator-Interface DefaultHandler 7

Überblick: Methoden des ContentHandler (1) void startdocument() void enddocument() void startelement(string namespaceuri, String localname, String qname, Attributes atts) void endelement(string namespaceuri, String localname, String qname) void characters(char[] ch, int start, int length) void setdocumentlocator(locator locator) void processinginstruction(string target, String data) // target: z.b. "xml-stylesheet". // data: der unstrukturierte Rest // d.h.: Pseudo-Attribute werden nicht erkannt wie z.b.: // <?xml-stylesheet type="text/css" href="order.css"?> 8

Überblick: Methoden des ContentHandler (2) void ignorablewhitespace(char[] ch, int start, int length) // validierender Parser: meldet ignorable whitespace mit // diesem Event und nicht als "characters" void skippedentity(string name) // falls Parser die (externe) DTD nicht liest, meldet er // eine Entity Referenz mit diesem Event (anstatt die // Entity zu expandieren und als "characters" zu melden. void startprefixmapping(string prefix, String uri) void endprefixmapping(string prefix) // nur interessant, wenn man auf ein Prefix in einem // Attribut-Wert zugreift (z.b. bei XML-Schema) SAX-1 9

Dokument-Verarbeitung void startdocument() void enddocument() Ein XMLReader + ContentHandler kann für die Verarbeitung mehrerer Dokumente (hintereinander!) verwendet werden. => Initialisierungen am besten in startdocument Wohlgeformtheitsfehler: werden vom Parser erst erkannt, nachdem er schon etliche Events geliefert hat. => dessen muss man sich beim Verarbeiten von Events bewusst sein (d.h.: ev. Rückrollen erforderlich). Allfälliger clean-up code in enddocument wird ev. nie ausgeführt. Reader + ContentHandler sind nicht thread-safe und reantrant. => Parallele Verarbeitung von mehreren Dokumenten erfordert mehrere Reader + ContentHandler Objekte. 10

Element-Verarbeitung void startelement(string namespaceuri, String localname, String qname, Attributes atts) void endelement(string namespaceuri, String localname, String qname) Argumente: namespaceuri: leerer String bei Element ohne Namespace qname = Präfix + ":" + localname atts: siehe nächste Folie SAX hat absolut kein "Gedächtnis". => Häufig verwendete Datenstruktur in der Applikation: Stack für die offenen Elemente: bei startelement: push Element-Informationen bei endelement: pop 11

Attributes Interface Die startelement Funktion liefert die Attribute dieses Elements als Attributes Objekt zurück. Zugriff mittels getlength()und Attribut-Index: String getlocalname(int index) String geturi(int index) String getqname(int index) String gettype(int index) Zugriff mittels Namespace-qualified name: int getindex(string uri, String localname) String getvalue(string uri, String localname) String gettype(string uri, String localname) Analog: Zugriff mittels qualified (prefixed) name, z.b.: int getindex(string qualifiedname) 12

Text-Verarbeitung void characters(char[] ch, int start, int length) Darstellung von Text-Inhalt: als Char-Array mit Start-Index und Längenangabe (insbes. bei langem Text): SAX-Parser darf Text auf beliebig viele hintereinander folgende characters Events aufteilen. Häufige Verarbeitungsart: Text-Inhalt in einem StringBuffer akkumulieren bei startelement: Initialisierung des StringBuffer bei endelement: Verarbeitung des gesamten Text-Inhalts. 13

Locator Interface Das Locator Interface erlaubt Zugriff auf die Stelle im Dokument, wo das letzte Event gefunden wurde. SAX-Parser sollte (muss aber nicht) Locator implementieren. Methoden, z.b.: int getlinenumber() int getcolumnnumber() Typischer Code, um Locator-Information verfügbar zu haben: Instanz-Variable für ContentHandler Objekt definieren: private Locator locator; Referenz auf Locator abspeichern: public void setdocumentlocator(locator locator) { this.locator = locator; } 14

DefaultHandler Deklaration des DefaultHandlers (in org.xml.sax.helpers): public class DefaultHandler extends Object implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler Enthält default-deklarationen für alle callback Funktionen dieser 4 Event Handler Default-Verhalten: "do nothing"-methoden Bequeme Definition eines eigenen SAX-Parsers: von DefaultHandler erben die tatsächlich benötigten callback Funktionen überschreiben SAX-2 15

6.3. weitere Event Handler EntityResolver DTDHandler ErrorHandler 16

EntityResolver Einzige Methode: InputSource resolveentity(string publicid, String systemid) Idee: Die resolveentity-methode wird vom Parser aufgerufen, wenn eine externe geparste Entity gefunden wurde. externe geparste Entities können mittels SystemId oder PublicId angegeben werden. Mittels resolveentity Methode bekommt die Applikation die Möglichkeit (insbes. bei PublicId) dem Parser eine andere InputSource bereitzustellen. 17

DTDHandler Methoden: void notationdecl(string name, String publicid, String systemid) void unparsedentitydecl(string name, String publicid, String systemid, String notationname) Idee: Während der Bearbeitung der DTD meldet der Parser die Deklarationen von Notations und unparsed Entities. Die Applikation speichert sich diese Informationen in eigenen Datenstrukturen (z.b. in Hash Tabelle) Wenn der Parser Attribute vom Typ "NOTATION", "ENTITY" oder "ENTITIES" meldet, hat die Applikation die nötigen Informationen. 18

ErrorHandler Methoden: void fatalerror(saxparseexception exception) // non-recoverable error void error(saxparseexception exception) void warning(saxparseexception exception) Idee: Bei Wohlgeformtheitsfehler wirft der Parser eine Exception und beendet den Parse-Vorgang. Bei anderen Fehlern (insbes. Gültigkeitsfehler bei validierendem Parser) kann der Parser fortsetzen und wirft keine Exception. Benachrichtigung der Applikation: Parser reicht SAXParseException an die entsprechende Methode des ErrorHandlers. 19

6.4. XMLReader Reader-Implementierung Features und Properties SAX-Ausgabe 20

Reader-Implementierung XMLReader Instanz mittels XMLReader Factory erzeugen Auswahl einer bestimmten Implementierung: Default-Implementierung auswählen: public static XMLReader createxmlreader() throws SAXException; // Auswahl des SAX-Parsers laut system property // org.xml.sax.driver (kann mit Kommandozeilen- // parameter "-D" gesetzt werden) Auswahl einer bestimmten Implementierung: public static XMLReader createxmlreader( String classname) throws SAXException; // classname = gewünschte Implementierung, // z.b.: "org.apache.xerces.parsers.saxparser" 21

Features und Properties XMLReader-Methoden: boolean getfeature(string name) throws SAXNotRecognizedException, SAXNotSupportedException Object getproperty(string name) throws SAXNotRecognizedException, SAXNotSupportedException void setfeature(string name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException void setproperty(string name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException 22

Features Haben einen boolean Wert: true / false Feature-Namen sind absolute URLs Standard-Features (z.b. validierend, Namespace-aware, ) parser.setfeature( "http://xml.org/sax/features/validation", true); parser.setfeature( "http://xml.org/sax/features/namespaces", true); Vendor-spezifische Features, z.b.: boolean schemavalidierend = parser.getfeature( "http://apache.org/xml/features/validation/schema"); boolean schemafullchecking = parser.setfeature( "http://apache.org/xml/features/validation/schema-fullchecking"); 23

Properties Haben einen "beliebigen" Typ, z.b.: Property "http://xml.org/sax/properties/lexical-handler" (ermöglicht Zugriff auf Kommentare, CDATA Sections, ) => das konkrete handler-objekt wird als Property gesetzt/gelesen. Property-Namen sind absolute URLs Weitere Standard-Properties, z.b.: Property "http://xml.org/sax/properties/xml-string" read-only Property: liefert den Text-String, der das aktuelle SAX- Event ausgelöst hat. Vendor-spezifische Properties, z.b.: Property "http://apache.org/xml/properties/schema/ external-schemalocation": gibt an, wo der Parser nach XML-Schema Dateien suchen soll. SAX-3 24

SAX-Ausgabe (1) Output des XMLReaders als XML-Dokument mittels "transformer", analog zur DOM-Ausgabe, d.h.: Importe Erzeuge mittels XMLReader eine SAXSource Aufruf des transformers mit dieser SAXSource als Input wie bei DOM: import javax.xml.transform.transformer; import javax.xml.transform.transformerfactory; import javax.xml.transform.stream.streamresult; SAX-spezifische Importe: import javax.xml.transform.sax.saxsource; import org.xml.sax.inputsource; 25

SAX-Ausgabe (2) Transformer-Instanzierung (wie bei DOM): TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newtransformer(); Ausgabe (d.h.: erzeuge SAXSource mittels XMLReader) SAXSource source = new SAXSource(reader, new InputSource(quelle)); StreamResult result = new StreamResult(new File(ziel)); transformer.transform(source, result); SAX-4 26

6.5. Benutzung von SAX in JAXP Überblick SAXParser Interface Features und Properties 27

Überblick 28

SAXParser-Interface (1) Das SAXParser-Interface in JAXP ist einfach ein Wrapper um den XMLReader. Erzeugung mittels statischer Methode newsaxparser() der Klasse SAXParserFactory. Mit getxmlreader() hat man Zugriff auf den XMLReader. Registrierung der Event Handler: Keine eigenen Set-Methoden erforderlich Statt dessen: DefaultHandler als Parameter beim Aufruf der parse()-methode des SAXParsers 29

SAXParser-Interface (2) Importe: SAXParser/SAXParserFactory import javax.xml.parsers.saxparserfactory; import javax.xml.parsers.saxparser; import org.xml.sax.saxexception; import org.xml.sax.saxparseexception; Factory-Instanzierung: SAXParserFactory factory = SAXParserFactory.newInstance(); Parser-Instanzierung und Parsen: DefaultHandler handler = new MyDefaultHandler(); try{ SAXParser saxparser = factory.newsaxparser(); saxparser.parse(new File(argv[0]), handler); } catch (Exception e) 30

Features und Properties Einstellungen des Parsers (z.b. validierend: ja/nein) SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(true); factory.setnamespaceaware(true); Methoden zum Zugriff auf Properties und Features: Object getproperty(string name) throws ; void setproperty(string name, Object value) throws ; boolean isnamespaceaware(); boolean isvalidating(); SAX-5 31

6.6. SAX-Filter Funktionsweise eines SAX-Filters Verwendung eines SAX-Filters 32

Funktionsweise eines SAX-Filters (1) 33

Funktionsweise eines SAX-Filters (2) Vorbereitung: Applikation teilt dem Filter mit, auf welchen Reader er horchen muss Applikation registriert ihre Event Handler beim Filter Start des Parse-Vorgangs: Applikation ruft parse()-methode des Filters auf Filter ruft parse()-methode des Readers auf Parse-Vorgang: Reader erzeugt Events => ruft callback Funktionen des Filters auf Filter ruft innerhalb seiner callback Funktionen die callback Funktionen der Applikation auf. Der Filter ist also gleichzeitig Event Handler und Reader. 34

Verwendung eines SAX-Filters XMLFilter Interface: erweitert XMLReader um 2 Methoden: void setparent(xmlreader parent) und XMLReader getparent() "parent" = Reader, auf den der Filter horchen muss Mittels setcontenthandler, etc. werden die Event Handler der Applikation beim Filter registriert. Implementierung des XMLFilter Interface: "per Hand": ziemlich aufwändig (XMLReader hat 14 Methoden) Eleganterer Weg: mittels XSLT Stylesheet kann ein XMLFilter automatisch erzeugt werden (späterer VL-Termin). Die Klasse XMLFilterImpl in org.xml.sax.helpers stellt einen Default- Filter bereit, der die Requests in beiden Richtungen transparent durchreicht. SAX-6 35

6.7. Epilog DOM vs. SAX Performance-Vergleich Literatur 36

DOM vs. SAX DOM: Baut gesamten XML-Baum im Speicher auf => wahlfreier Zugriff Manipulation des Baums möglich Hoher Speicherbedarf, langsamer SAX: XML-Dokument wird einmal durchlaufen => sequentieller Zugriff "streaming" möglich (d.h.: Bearbeiten und Weiterreichen, bevor das ganze Dokument übertragen ist). Geringerer Speicherbedarf, höhere Geschwindigkeit Falls mehrmaliger Zugriff auf Knoten erforderlich: Applikation ist selbst für das Puffern verantwortlich. Low level (DOM-API benutzt SAX-API) 37

Performance-Vergleich *) Test Cases: 1. Read and parse a small DTD-enforced XML file (approx. 25 elements) 2. Read and parse a large DTD-enforced XML file (approx. 50,000 elements) 3. Navigate the DOM created by Test #2 from root to all children. 4. Build a large DOM (approximately 60,000 elements) from scratch 5. Build an "infinitely" large DOM from scratch using createelement(...) and similar function calls until a java.outofmemoryerror is raised. Measure the time it takes to hit the "memory wall" within a default (32MB heap) JRE and count how many elements are created. *) Quelle: "XML Parsers: DOM and SAX Put to the Test" von Steve Franklin, http://www.devx.com/xml/article/16922/ 38

Performance-Vergleich Ergebnis der Tests: 39

Literatur Spezifikationen: http://www.w3.org/dom/ http://www.saxproject.org/ (Online) Bücher und Artikel: Elliotte Rusty Harold: "Processing XML with Java" http://www.cafeconleche.org/books/xmljava/ J2EE Tutorial (Kap. 4-7): http://java.sun.com/j2ee/1.4/docs/tutorial/doc/ 40