39
XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Embed Size (px)

Citation preview

Page 1: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

XML-Schnittstellen:

SAX, DOM, XML Pull Parsing

Timo Terletzki

03.11.2004

Transformation von XML-Dokumenten

Page 2: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Übersicht

1. Motivation

2. XML Parser für Java

3. Document Object Model

4. Simple API for XML

5. SAX vs. DOM

6. XML Pull Parsing

7. Zusammenfassung

Page 3: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

1. Motivation

Ziel: Informationen aus XML Dokumenten auslesen

- es ist möglich XML Dokumente mit einem Textfile Reader auszulesen

- es ist sehr aufwendig einen solchen XML-File Reader zu implementieren

- der XML-File Reader muss für jedes Programm neu geschrieben werden

W3C legt einen Standard für XML-File Reader fest

Page 4: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

2. XML Parser für Java

XML Parser für Java:

- ermöglicht den Zugriff auf Informationen in einem XML Dokument

- Informationen können direkt in Java Objekte konvertiert werden, oder anderweitig verarbeitet werden

- wird von vielen Firmen kostenlos bereitgestellt, z. B. Sun, Datachannel, IBM, ...

- kann vom Programmierer implementiert werden (optional)

Page 5: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3. Document Object Model

Übersicht

• Document Object Model

• DOM XML Parser

• Document Object Model API

• Document Object

• Zusammenfassung

• Beispiel

Page 6: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Anforderungen an das Document Object Model:

- alle Informationen aus dem XML Dokument müssen angesteuert und geändert werden können

- Navigation von Element zu Element muss ermöglicht werden

- Elemente und Attribute müssen abgefragt werden können

- grundlegende Funktionen, wie z.B. getfist und getnext, müssen bereitgestellt werden

3.1 DOM – Document Object Model

Page 7: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

DOM XML Parser für Java:

- konvertiert ein XML Dokument in einen Objektbaum

- übernimmt das Lesen und Speichern der Daten aus dem XML Dokument

- speichert die Daten als ein Document Object

- muss die Document Object Model API implementieren

- wird vom Programmierer nicht implementiert

- wird auch für andere Programmiersprachen bereitgestellt

3.2 DOM – DOM XML Parser

Page 8: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.3 DOM – Document Object Model API

Document Object Model API (Java):

- ist eine Sammlung von Java Interfaces, vergleichbar mit dem Swing Component Model

- die Interfaces müssen vom XML Parser implementiert werden, damit Daten bearbeitet werden können

- enthält keine Information aus dem XML-File

- ermöglicht hierarchischen Zugriff auf das Document Object

- ermöglicht das Ändern, Löschen und Neuanlegen von Knoten

Page 9: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Quelle: „Introduction to DOM“ www.developerlife.com

3.3 DOM – Document Object Model API

Es gibt noch weitere Interfaces,z.B. Comment, Text undProcessingInstruction

Page 10: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.4 DOM – Document Object

Document Object:

- enthält einen Baum, der die Struktur des XML-Files darstellt

- die Knoten enthalten die Information des XML-Files

- jeder Knoten enthält Informationen wie Knotenname, Knotenwert und ggf. Kinderknoten

- das Document Object ist der Wurzelknoten (von Knoten abgeleitet)

- kann mit Hilfe der DOM API gelesen und bearbeitet werden

Page 11: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Quelle: „Introduction to DOM“ www.developerlife.com

3.4 DOM – Document Object

Page 12: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Quelle: „Introduction to DOM“ www.developerlife.com

3.5 DOM – Zusammenfassung

Page 13: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.6 DOM – Beispiel

DOM Objekt aus XML File erzeugen:

Sun XML Parser

import com.sun.xml.tree.*; import org.w3c.dom.*;

try {     String url =          "http://.../AddressBook.xml";     Document doc =          XmlDocumentBuilder.createXmlDocument(url);} catch(Exception e){}

Page 14: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.6 DOM – Beispiel

DOM Objekt aus XML File erzeugen:

IBM XML Parser

import com.ibm.xml.parser.*; import org.w3c.dom.*;

try {     URL u = new URL("http://.../AddressBook.xml");     InputStream i = u.openStream();     Parser ps = new Parser(„IBM XML Parser");     Document doc = ps.readStream(i); } catch( Exception e ){}

Page 15: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Quelle: „XML and Java Tutorial, Part I “ www.developerlife.com

3.6 DOM – Beispiel

Page 16: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Quelle: „XML and Java Tutorial, Part I “ www.developerlife.com

3.6 DOM – Beispiel

“\r“ = Zeilenvorschub

Page 17: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.6 DOM – Beispiel

Knoten auslesen:

NodeList listOfPersons = doc.getElementsByTagName( "PERSON" );

int numberOfPersons = listOfPersons.getLength();

if (numberOfPersons > 0 ){

Node firstPersonNode = listOfPersons.item( 0 );

if ( firstPersonNode.getNodeType() == Node.ELEMENT_NODE ){

     Element firstPersonElement = (Element)firstPersonNode;

}}

NodeList firstNameList =  firstPersonElement.getElementsByTagName( "FIRSTNAME" );

Page 18: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

3.6 DOM – Beispiel

Knoten auslesen:

Element firstNameElement = firstNameList.item( 0 );

NodeList list = firstNameElement.getChildNodes();

String firstName = null;

for (int i = 0 ; i < list.getLength() ; i ++ ){

    String value =  ((Node)list.item( i )).getNodeValue().trim();

    if( value.equals("") || value.equals("\r") ){

        continue; //keep iterating

    } else{

        firstName = value;

        break; //found the firstName!     } }

Page 19: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

4. Simple API for XML

Übersicht

• SAX Parser

• Object Model

• Document Handler

• Zusammenfassung

• Beispiel

Page 20: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

SAX Parser:

- z.B. Sun TR2 XML Parser, IBM XML Parser for Java, OpenXML, ...

- muss die Simple API for XML implementieren

- liest das XML Dokument und feuert Ereignisse (Events)

- die Reihenfolge der gefeuerten Events ist sehr wichtig

- Events werden gefeuert:

- am Anfang und am Ende des XML Dokuments- wenn Knoten Tags geöffnet und geschlossen werden- wenn Knotenwerte ausgelesen werden

- Speichert keine Informationen aus dem XML Dokument

4.1 SAX – SAX Parser

Page 21: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Object Model:

- SAX hat kein Object Model

- der Programmierer muss sich selber um die Verarbeitung der Informationen kümmern

- der Programmierer kann sein eigenes Object Model erstellen (optional)

- der Programmierer hat volle Kontrolle über das Speichern von Informationen

4.2 SAX – Object Model

Page 22: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Document Handler:

- ist ein Listener für die im SAX Parser gefeuerten Events und muss sich beim SAX Parser als solcher registrieren

- wird bei jedem Event vom SAX Parser aufgerufen

- ist für die Verarbeitung der gelesenen Informationen zuständig

- legt ggf. Instanzen von Objekten aus dem Object Model an

- muss die Reihenfolge der gefeuerten Events beachten

4.3 SAX – Document Handler

Page 23: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

4.3 SAX – Document Handler

Quelle: „Introduction to DOM“ www.developerlife.com

Page 24: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Zusammenfassung:

- es gibt kein vorgegebenes Object Model

- SAX Parser liest das Dokument aus und feuert Events

- die Reihenfolge der gefeuerten Events ist für den Document Handler sehr wichtig

- Document Handler ist Listener für die gefeuerten Events

- Document Handler ist für die Verarbeitung der gelesenen Informationen zuständig

4.4 SAX – Zusammenfassung

Page 25: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

XML Dokument:

<?xml version = "1.0"?> <addressbook> <person> <lastname>Timo</lastname> <firstname>Terletzki</firstname> <email>[email protected]</email> </person> </addressbook>

4.5 SAX – Beispiel

Page 26: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

4.5 SAX – Beispiel

Object Model:

AdressBook

List persons

getSize()addPerson(Person a)getPerson(int i)deletePerson(int i)toXML()

Person

String firstnameString lastnameString email

get-/set-Methoden()toXML()

Page 27: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Document Handler:

import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.ParserFactory; import com.sun.xml.parser.Resolver;

public class SaxAddressBookHandler extends HandlerBase{

private AddressBook ab = new AddressBook(); private Person p = null; private String currentElement = null;

public AddressBook getAddressBook(){ return ab; }

4.5 SAX – Beispiel

Page 28: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Document Handler:

public void startElement( String name , AttributeList atts ){

if( name.equalsIgnoreCase("LASTNAME") ) {

currentElement = "LASTNAME"; }

else if( name.equalsIgnoreCase("FIRSTNAME") ) {

currentElement = "FIRSTNAME"; }

else if( name.equalsIgnoreCase("COMPANY") ) {

currentElement = "COMPANY"; }

else if( name.equalsIgnoreCase("EMAIL") ) {

currentElement = "EMAIL"; }

else if( name.equalsIgnoreCase("PERSON") ) {

p = new Person(); }

}

4.5 SAX – Beispiel

Page 29: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Document Handler:

public void characters( char ch[], int start, int length ){

String value = new String( ch , start , length );

if(!value.trim().equals("")) {

if( currentElement.equalsIgnoreCase("FIRSTNAME") ) {

p.setFirstName( value ); }

else if( currentElement.equalsIgnoreCase("LASTNAME") ) {

p.setLastName( value ); }

else if( currentElement.equalsIgnoreCase("COMPANY") ) {

p.setCompany( value ); }

else if( currentElement.equalsIgnoreCase("EMAIL") ) {

p.setEmail( value ); } }

4.5 SAX – Beispiel

Page 30: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Document Handler:

public void endElement( String name ){

if( name.equalsIgnoreCase("PERSON") ) {

ab.addPerson( p );

p = null;

}

}

4.5 SAX – Beispiel

Page 31: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

SAX Parser:

import java.net.*; import java.io.*; import org.xml.sax.*;... try{ InputStreamReader isr = new InputStreamReader( new FileReader( new File( "AddressBook.xml" )) ); InputSource is = new InputSource( isr ); DocumentHandler handler = new SaxAddressBookHandler(); String parserClassName = "com.sun.xml.parser.Parser"; org.xml.sax.Parser parser = org.xml.sax.helpers.ParserFactory. makeParser( parserClassName ); parser.setDocumentHandler( handler ); parser.parse( is ); AddressBook ab = handler.getAddressBook();} catch(Throwable t){} ...

4.5 SAX – Beispiel

Page 32: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

5. SAX vs. DOM

DOM:

- hierarchisches Object Model

- Information wird in Knoten in einem Baum gespeichert

- bewahrt die Reihenfolge der gelesenen Elemente

SAX:

- feuert eine Reihe von Events

- es kann ein eigenes Object Model verwendet werden

- es muss ein Document Handler geschrieben werden, der die Events abfängt und die Daten verarbeitet

- ist zur Laufzeit schneller, da kein Objektbaum aufgebaut werden muss

Page 33: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

5. SAX vs. DOM

DOM eignet sich besser, wenn:

- die Daten im XML Dokument immer wieder geändert werden müssen

- eine Baumstruktur zur Navigation benötigt wird

SAX eignet sich besser, wenn:

- die Daten zu groß sind um sie als Baum gespeichert zu werden

- nur Teile des XML Dokuments zur Verarbeitung verwendet werden

Page 34: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

6. XML Pull Parsing

Übersicht

• Eigenschaften

• Beispiel

Page 35: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Eigenschaften:

- sehr einfaches Interface

- es gibt 5 Events: START_DOCUMENT, START_TAG, TEXT, END_TAG, END_DOCUMENT

- Programmierer holt sich selber die Events selbst und verarbeitet diese in seinen Methoden

- die Methode next() holt sich das nächste Event

- ermöglicht Implementierung von sehr schnellen XML Parser

6.1 XML Pull Parsing - Eigenschaften

Page 36: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

6.2 XML Pull Parsing - Beispiel

import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory;

public static void main (String args[]) throws XmlPullParserException, IOException {

XmlPullParserFactory factory = XmlPullParserFactory.newInstance( “XMLParserImplementierung“, null);

XmlPullParser xpp = factory.newPullParser();

xpp.setInput ( new FileReader ( “AdressBook.xml“ ) );

this.processDocument(xpp);}

Page 37: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

6.2 XML Pull Parsing - Beispiel

public void processDocument(XmlPullParser xpp) {

int eventType = xpp.getEventType(); do { if(eventType == XmlPullParser.START_DOCUMENT) { ... } else if(eventType == XmlPullParser.END_DOCUMENT) { ... } else if(eventType == XmlPullParser.START_TAG) { System.out.println(“Anfang “ + xpp.getName()); } else if(eventType == XmlPullParser.END_TAG) { System.out.println(“Ende “ + xpp.getName()); } else if(eventType == XmlPullParser.TEXT) { System.out.println(xpp.getText); } eventType = xpp.next(); } while (eventType != XmlPullParser.END_DOCUMENT); }

Page 38: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

DOM:

- DOM Parser liest das Dokument aus und speichert die Daten als Objektbaum

- sehr leicht zu nutzen, da der Objektbaum mit Methoden der DOM API ausgelesen werden kann

SAX:

- SAX Parser liest Informationen aus und feuert Events

- ein Document Handler muss implementiert werden, der die Informationen verarbeitet

- es kann ein eigenes Object Model erstellt werden

XMLPullParsing:

- Events werden selbst geholt und verarbeitet

- Volle Kontrolle über den Parse-Prozess

7. Zusammenfassung

Page 39: XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten

Ende

Vielen Dank für die Aufmerksamkeit.