20.10 | SAX (Simple API for XML) |
Das Simple API for XML (SAX) ist eine Event-orientierte Schnittstelle zur Verarbeitung von XML-Dokumenten. SAX wurde von David Megginson entwickelt und definiert einen einheitlichen Zugriff auf den Parser und auf die Ereignisse beim Parse-Vorgang. Ähnlich zu DOM besteht SAX zum größten Teil aus Interfaces, die Parser-spezifisch durch so genannte SAX-Treiber implementiert werden. Die meisten gängigen Parser wie Crimson, Xerces oder auch XP enthalten standardmäßig eine SAX-Implementierung.
SAX definiert beispielsweise eine Methode parse(), mit der der Parser veranlasst wird, ein Dokument zu analysieren. Darüber hinaus spezifiziert SAX Interfaces und Klassen, mit denen eine XML-Applikation beim Eintritt bestimmter Ereignisse während der Baumtraversierung Callbacks erhalten kann, z. B. beim Erreichen des Anfangs oder des Endes eines Elements.Um eine XML-Applikation mit SAX zu erstellen, sind in der Regel drei Schritte erforderlich:
Abbildung 20.10 zeigt das Zusammenspiel zwischen Parser, SAX-Treiber und XML-Applikation noch einmal im Überblick.
- Die Verarbeitungslogik wird in einer Unterklasse der Klasse DefaultHandler im Paket org.xml.sax.helpers ximplementiert. DefaultHandler ist eine Basisklasse für SAX-Event-Handler.
- Es muss ein Parser-Exemplar über die entsprechende Factory-Klasse erzeugt werden.
- Der Parse-Vorgang wird mit der Methode parse() angestoßen.
Das folgende Beispiel eines SAX-Event-Handlers gibt die Schachtelungshierarchie der Elemente eines XML-Dokuments auf der Standardausgabe aus. Hierzu wird zunächst eine Unterklasse von DefaultHandler definiert:class NestingHandler extends DefaultHandler { // Zähler für die Schachtelungstiefe int nestingLevel = 0; public void startElement(String uri, String localName, String qName, Attributes attributes) { // Am Anfang eines Elements die Ausgabe einrücken... for(int i = 0; i < nestingLevel*2; i++) System.out.print(' '); System.out.println(qName); // ...und die Schachtelungstiefe hochzählen nestingLevel++; } public void endElement(String uri, String localName, String qName) { nestingLevel--; } }Die Erzeugung eines SAX-Parsers erfolgt mit der Klasse SAXParserFactory. Zuvor muss eine Referenz auf die Factory mit der statischen Methode newInstance() ermittelt werden.SAXParserFactory factory; SAXParser parser; // Abruf eines Factory-Exemplars factory = SAXParserFactory.newInstance(); // Erzeugung des Parsers über diese Factory parser = factory.newSAXParser();Nachdem ein SAXParser-Exemplar vorhanden ist, kann der Parse-Vorgang mit folgender Zeile angestoßen werden:parser.parse(new File(args[0]), new NestingHandler());Hierbei wird zum einen die Quelle des zu analysierenden Dokuments angegeben (hier eine Datei, deren Name als Kommmandozeilen-Parameter übergeben wird) und zum anderen der Event-Handler, der von den Parser-Ereignissen benachrichtigt werden soll. In diesem Fall wird ein Exemplar des zuvor gezeigten NestingHandler übergeben.
Die Ausgabe könnte etwa folgendermaßen aussehen:TELEFONLISTE MITARBEITER NAME EMAIL TEL MITARBEITER NAME EMAIL TEL MITARBEITER NAME EMAIL TELDiese Ausgabe bezieht sich auf das Beispieldokument, das im nachfolgenden Abschnitt verwendet wird.Material zum Beispiel
- Quelltexte: