Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur...

22
Verarbeitung von XML mit SAX und DOM Sven Peters Seminar “Dokumentenverarbeitung” – Typeset by Foil T E X

Transcript of Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur...

Page 1: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

Verarbeitung von XML mit SAX und DOM

Sven Peters

Seminar “Dokumentenverarbeitung”

– Typeset by FoilTEX –

Page 2: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 3: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 4: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 5: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 6: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 7: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 8: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 9: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 10: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 11: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 12: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 13: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 14: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 15: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 16: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 17: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 18: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

DOM-Baum

17

Page 19: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 20: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 21: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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

Page 22: Verarbeitung von XML mit SAX und DOM · PDF fileSAX Simple Api for XML Urspunglich nur f ur Java Peter Murray-Rust (Jumbo XML Browser) -> YAXPAPI (Yet Another XML Parser API) Zusammen

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