Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur...
Transcript of Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur...
Verarbeitung von XML mit SAX und DOM
Sven Peters
Seminar “Dokumentenverarbeitung”
– Typeset by FoilTEX –
SAX Simple Api for XML
• Urspunglich nur fur Java
• Peter Murray-Rust (Jumbo XML Browser) -¿ YAXPAPI (Yet Another XMLParser API)
• Zusammen mit Tim Bray (Lark XML parser) und David Megginson (ÆlfredXML 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 fur 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
Mogliche 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 Lange der gultigenZeichen 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. Verstoße gegen dieDTD
• 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 fur Java und ECMAScript
Spezifikationen in Levels
• Level 1 Navigation und Manipulation innerhalb eines Dokuments (seit Oktober1998)
• 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 reprasentiert
es enthalt
• 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 konnen nichtalleine 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)
• Hinzufugen und Entfernen von Kindknoten (childNode)
wichtige Knoten: Element und Text
14
Elementknoten
Elementknoten (im Beispiel: collection, cd, artist, title, song)
Wie Knoten, zusatzlich Methoden zur Verwaltung von Attributen:
• erzeugen und schreiben (setAttribute)
• loschen (removeAttribute)
• lesen (getAttribute)
15
Textknoten
• Textknoten reprasentieren jegliche Art von Text, der nicht zum Markup gehort
• Textknoten haben normalerweise keine Kinder
• Nebeneinanderliegende Textknoten konnen zusammengefaßt werden (Normali-sierung)
• Methoden getData und setData fur Zugriff auf den eigentlichen Text
16
DOM-Baum
17
Beispiel fur 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 komplementar, d.h. des einen Vorteile sindmeist des anderen Nachteile
• Vorteile von SAX
– geringer Speicherbedarf– einfache API
• Vorteile von DOM
– Baumstruktur bleibt erhalten– Direkte Manipulation moglich
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 fur DOM einfach zu groß ist
• Streaming
20
SAX oder DOM?
DOM bietet sich an, wenn
• die native Datenstruktur XML ist
• umfangreiche Transformationen notig sind
• flexible Manipulationen fur Außenstehende moglich sein sollen (z.B. per Ja-vaScript)
• zur Verarbeitung von Vorlagen(Templates)
21