Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten."—  Präsentation transkript:

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

2 Ü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

3 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

4 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)

5 3. Document Object Model Übersicht Document Object Model DOM XML Parser Document Object Model API Document Object Zusammenfassung Beispiel

6 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

7 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

8 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

9 Quelle: Introduction to DOM 3.3 DOM – Document Object Model API Es gibt noch weitere Interfaces, z.B. Comment, Text und ProcessingInstruction

10 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

11 Quelle: Introduction to DOM 3.4 DOM – Document Object

12 Quelle: Introduction to DOM 3.5 DOM – Zusammenfassung

13 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){}

14 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 ){}

15 Quelle: XML and Java Tutorial, Part I 3.6 DOM – Beispiel

16 Quelle: XML and Java Tutorial, Part I 3.6 DOM – Beispiel \r = Zeilenvorschub

17 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" );

18 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! }

19 4. Simple API for XML Übersicht SAX Parser Object Model Document Handler Zusammenfassung Beispiel

20 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

21 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

22 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

23 Quelle: Introduction to DOM

24 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

25 XML Dokument: Timo Terletzki 4.5 SAX – Beispiel

26 Object Model: AdressBook List persons getSize() addPerson(Person a) getPerson(int i) deletePerson(int i) toXML() Person String firstname String lastname String get-/set-Methoden() toXML()

27 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

28 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(" ") ) { currentElement = " "; } else if( name.equalsIgnoreCase("PERSON") ) { p = new Person(); } } 4.5 SAX – Beispiel

29 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(" ") ) { p.set ( value ); } } 4.5 SAX – Beispiel

30 Document Handler: public void endElement( String name ){ if( name.equalsIgnoreCase("PERSON") ) { ab.addPerson( p ); p = null; } 4.5 SAX – Beispiel

31 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){} SAX – Beispiel

32 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

33 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

34 6. XML Pull Parsing Übersicht Eigenschaften Beispiel

35 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

36 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); }

37 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); }

38 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

39 Ende Vielen Dank für die Aufmerksamkeit.


Herunterladen ppt "XML-Schnittstellen: SAX, DOM, XML Pull Parsing Timo Terletzki 03.11.2004 Transformation von XML-Dokumenten."

Ähnliche Präsentationen


Google-Anzeigen