Verarbeitung von XML mit SAX und DOM Sven Peters Seminar Dokumentenverarbeitung Typeset by FoilTEX
Urspünglich nur für Java SAX Simple Api for XML Peter Murray-Rust (Jumbo XML Browser) - YAXPAPI (Yet Another XML Parser API) Zusammen mit Tim Bray (Lark XML parser) und David Megginson (Ælfred XML parser) Diskussion XML-DEV Erster Entwurf: 12. Januar 1998 SAX 1.0: 11. Mai 1998 Heute: SAX 2.0.1 seit 29. Januar 2002 1
Bekannte Parser SAX ist kein XML-Parser sondern eine standardisierte Schnittstelle für solche! Bekannte Parser: Ælfred2 (GNU) Crimson (Enthalten im JDK1.4, vom Apache-Projekt) Xerces (Teil des Apache-Projekts) XP 0.5 (James Clark, einer der ersten XML-Parser in Java, veraltet) 2
Events SAX basiert auf Ereignissen (Events) Der Parser sendet Events an registrierte Eventhandler Mögliche Ereignisse: start document start element characters end element end document 3
Parameter der Ereignisse: start document und end document sind parameterlos start element: URI lokaler Name qualifizierter Name Liste von Attributen end element: wie start element, jedoch ohne Attribute characters: Ein Array von Zeichen sowie Startindex und Länge der gültigen Zeichen des Arrays 4
Parsingfehler Fehler beim parsen werden als Events an den Errorhandler gesendet: error Alle Fehler, die das Parsen nicht weiter behindern, z.b. Verstöße gegen die DTD fatalerror Fehler, die ein weiteres Parsen verhindern, z.b. Dokument nicht wohlgeformt warning sonstiges 5
Parser instanzieren Defaultparser instanziieren: XMLReader xr = XMLReaderFactory.createXMLReader(); Defaultparser selber setzten beim Aufruf von Java: java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser... Einen bestimmten Parser direkt instanziieren: XMLReader xr = new gnu.xml.aelfred2.xmlreader(); 6
Handler registrieren public class MyHandler extends DefaultHandler { public void startdocument () { System.out.println("Start Dokument"); } public void enddocument () { System.out.println("Ende Dokument"); } public void startelement(string uri, String name, String qname, Attributes atts) { System.out.println("Start Element: " + qname) } public void endelement(string uri, String name, String qname) { System.out.println("Ende Element: " + qname); } } 7
Characters public void characters (char ch[], int start, int length) { System.out.print("Characters: \""); for (int i = start; i < start + length; i++) { switch (ch[i]) { case \\ : System.out.print("\\\\"); break; case " : System.out.print("\\\""); break; case \n : System.out.print("\\n"); break; case \r : System.out.print("\\r"); break; case \t : System.out.print("\\t"); break; default: System.out.print(ch[i]); break; } } System.out.print("\"\n"); } 8
Beispiel XML Datei <?xml version="1.0"?> <collection> <cd year="1973"> <artist>queen</artist> <title>queen</title> <song>keep Yourself Alive</song> <song>doing All Right</song> <song>great King Rat</song> <song>my Fairy King</song> <song>liar</song> <song>the Night Comes Down</song> <song>modern Times Rock n Roll</song> <song>son And Daughter</song> <song>jesus</song> </cd> </collection> 9
SAX-Parser starten XMLReader xr = XMLReaderFactory.createXMLReader(); MyHandler mh = new MyHandler(); xr.setcontenthandler(mh); String dateiname = Buch.xml ; FileReader fr = new FileReader(dateiname); InputSource is = new InputSource(fr); xr.parse(is); 10
Ausgabe Start document Start element: collection Characters: "\n" Start element: cd Characters: "\n" Start element: artist Characters: "Queen" End element: artist Characters: "\n" Start element: title Characters: "Queen" End element: title Characters: "\n" Start element: song Characters: "Keep Yourself Alive" End element: song Characters: "\n"... Start element: song Characters: "Jesus" End element: song Characters: "\n" End element: cd Characters: "\n" End element: collection End document 11
DOM W3C Document Object Model Offizielle Bindungen für Java und ECMAScript Spezifikationen in Levels Level 1 Navigation und Manipulation innerhalb eines Dokuments (seit Oktober 1998) Level 2 Namespaces, CSS, Events (seit November 2000) Level 3 Laden und Speichern, XPath (noch in Entwicklung) 12
Aufbau Das gesamte XML-Dokument wird durch das Interface Document repräsentiert es enthält den Wurzel-Knoten des Dokuments (getdocumentelement) falls vorhanden die DTD (getdoctype) Methoden um Knoten nach ID oder Namen zu suchen (getelementbyid, getelementsbytagname) Methoden zum erzeugen neuer Knoten(create...) 13
Knoten Knoten sind immer einem bestimmen Dokument zugeordnet, sie können nicht alleine existieren ein Knoten bietet Methoden zur Bewegung in die Tiefe, Zugriff auf Kindknoten (childnode) Zur Seite, Zugriff auf Geschwisterknoten (siblingnode) nach Oben, Zugriff auf Elternknoten (parentnode) Hinzufügen und Entfernen von Kindknoten (childnode) wichtige Knoten: Element und Text 14
Elementknoten Elementknoten (im Beispiel: collection, cd, artist, title, song) Wie Knoten, zusätzlich Methoden zur Verwaltung von Attributen: erzeugen und schreiben (setattribute) löschen (removeattribute) lesen (getattribute) 15
Textknoten Textknoten repräsentieren jegliche Art von Text, der nicht zum Markup gehört Textknoten haben normalerweise keine Kinder Nebeneinanderliegende Textknoten können zusammengefaßt werden (Normalisierung) Methoden getdata und setdata für Zugriff auf den eigentlichen Text 16
DOM-Baum 17
Beispiel für DOM Ausgabe aller Songs DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newdocumentbuilder(); Document document = builder.parse(newfile(filename)); NodeList nodelist = document.getelementsbytagname("song"); for (int i = 0; i <nodelist.getlength(); i++) { Node songnode = nodelist.item(i); Node childnode = songnode.getfirstchild(); if ((childnode!= null) && (childnode.getnodetype() == Node.TEXT NODE)) { Text textnode = (Text) childnode; System.out.println(textNode.getData()); } } 18
DOM oder SAX? DOM und SAX sind weitgehend komplementär, d.h. des einen Vorteile sind meist des anderen Nachteile Vorteile von SAX geringer Speicherbedarf einfache API Vorteile von DOM Baumstruktur bleibt erhalten Direkte Manipulation möglich 19
SAX oder DOM? SAX bietet sich an, wenn nur Teile des XML-Dokumentes gebraucht werden XML-Daten sowieso auf interne Datenstrukuren abgebildet werden der Datenumfang für DOM einfach zu groß ist Streaming 20
DOM bietet sich an, wenn SAX oder DOM? die native Datenstruktur XML ist umfangreiche Transformationen nötig sind flexible Manipulationen für Außenstehende möglich sein sollen (z.b. per JavaScript) zur Verarbeitung von Vorlagen(Templates) 21