Upload
winfried-stueber
View
113
Download
0
Embed Size (px)
Citation preview
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
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
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)
3. Document Object Model
Übersicht
• Document Object Model
• DOM XML Parser
• Document Object Model API
• Document Object
• Zusammenfassung
• Beispiel
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
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
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
Quelle: „Introduction to DOM“ www.developerlife.com
3.3 DOM – Document Object Model API
Es gibt noch weitere Interfaces,z.B. Comment, Text undProcessingInstruction
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
Quelle: „Introduction to DOM“ www.developerlife.com
3.4 DOM – Document Object
Quelle: „Introduction to DOM“ www.developerlife.com
3.5 DOM – Zusammenfassung
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){}
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 ){}
Quelle: „XML and Java Tutorial, Part I “ www.developerlife.com
3.6 DOM – Beispiel
Quelle: „XML and Java Tutorial, Part I “ www.developerlife.com
3.6 DOM – Beispiel
“\r“ = Zeilenvorschub
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" );
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! } }
4. Simple API for XML
Übersicht
• SAX Parser
• Object Model
• Document Handler
• Zusammenfassung
• Beispiel
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
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
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
4.3 SAX – Document Handler
Quelle: „Introduction to DOM“ www.developerlife.com
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
XML Dokument:
<?xml version = "1.0"?> <addressbook> <person> <lastname>Timo</lastname> <firstname>Terletzki</firstname> <email>[email protected]</email> </person> </addressbook>
4.5 SAX – Beispiel
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()
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
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
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
Document Handler:
public void endElement( String name ){
if( name.equalsIgnoreCase("PERSON") ) {
ab.addPerson( p );
p = null;
}
}
4.5 SAX – Beispiel
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
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
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
6. XML Pull Parsing
Übersicht
• Eigenschaften
• Beispiel
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
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);}
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); }
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
Ende
Vielen Dank für die Aufmerksamkeit.