Die Simple API for XML (SAX)

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

SAX, die Simple API for XML, ist eine ereignisbasierte API zum Parsen von XML-Dokumenten. Die SAX-API wird von vielen verschiedenen Parsern implementiert, darunter Xerces, Crimson, MSXML, dem Oracle XML Parser für Java und Ælfred. SAX wurde ursprünglich als reine Java-Schnittstelle entwickelt und ist dementsprechend vor allem für in Java geschriebene Parser gedacht. Deshalb werden wir uns in diesem Abschnitt vor allem auf die Java-Version der Schnittstelle konzentrieren. SAX wurde aber trotzdem auf die meisten objektorientierten Programmiersprachen übertragen, darunter C++, Python, Perl und Eiffel. Die Portierung aus Java ist in der Regel ziemlich unkompliziert.

Die SAX-API ist im Vergleich zu den anderen XML-APIs ungewöhnlich, denn sie verwendet ein ereignisorientiertes Push-Modell anstelle eines baumbasierten Pull-Modells. Während der XML-Parser das XML-Dokument liest, füttert er zur selben Zeit das Anwendungsprogramm mit Informationen aus dem Dokument. Jedes Mal, wenn der Parser ein Start-Tag, ein End-Tag, Zeichendaten oder eine Verarbeitungsanweisung vorfindet, teilt er das dem Programm sofort mit. Im Programm wird das gesamte Dokument Schritt für Schritt sichtbar, von Anfang bis zum Ende. Sie können ganz nach Wahl die für Sie interessanten Abschnitte herausgreifen und für die weitere Bearbeitung speichern, bis das gesamte Dokument gelesen ist, oder aber die gelesenen Daten sofort verarbeiten. Sie müssen nicht warten, bis das ganze Dokument gelesen ist, um die Daten am Anfang des Dokuments zu bearbeiten. Der vielleicht wichtigste Punkt: Es ist nicht erforderlich, eine Kopie des gesamten Dokuments im Speicher abzulegen. Diese Fähigkeit macht SAX zur API der Wahl für sehr große Dokumente, die möglicherweise nicht mehr in den Hauptspeicher passen.

Anmerkung: Wir betrachten in diesem Abschnitt ausschließlich SAX2. Im Jahr 2004 unterstützen alle wichtigen XML-Parser mit SAX-Unterstützung auch SAX2. Der wesentliche Unterschied von SAX2 zu SAX1 ist die Einführung von Namensräumen, die Änderungen an den Namen und Signaturen fast aller Methoden und Klassen von SAX erforderlich machte. Die alten Methoden und Klassen aus SAX1 sind zwar noch vorhanden, werden aber als veraltet (deprecated) betrachtet und sollten besser nicht mehr verwendet werden.

SAX besteht im Wesentlichen aus einer Reihe von Java-Interface-Definitionen im Package org.xml.sax. Ein solches Interface ist zum Beispiel XMLReader, eine Abstraktion des echten XML-Parsers. Das Interface deklariert Methoden zum Parsen eines Dokuments und zur Konfiguration des Parsers. Zum Beispiel kann man die Validierung an- und abschalten. Um ein Dokument mit SAX zu parsen, erzeugt man eine Instanz der Klasse XMLReader. Zu diesem Zweck verwendet man die Klasse XMLReaderFactory aus dem Package org.xml.sax.helpers. Diese Klasse hat eine statische Methode createXMLReader( ), die dann eine parserspezifische Implementierung des Interface XMLReader generiert. Die Auswahl der konkreten Klasse erfolgt über das System-Property org.xml.sax.driver:

try {
  XMLReader parser = XMLReaderFactory.createXMLReader(  );
  // Das Dokument parsen ...
}
catch (SAXException e) {
  // Die Erzeugung des XMLReader schlug fehl
}

Dieses Verpacken von XMLReaderFactory.createXMLReader( ) in einem try-catch-Block ist typisch. Das Ziel ist es, eine mögliche SAXException abzufangen. Die SAXException ist eine generische Superklasse, mit der der XML-Parser beliebige Probleme beim Lesen und Analysieren des XML-Dokuments anzeigen kann. Im obigen Beispiel könnte eine solche Exception zum Beispiel bedeuten, dass das System-Property org.xml.sax.driver nicht gesetzt ist oder dass die angegebene Java-Klasse nicht im Klassenpfad gefunden werden konnte.

Achtung! Meiden Sie die in JAXP enthaltenen Klassen SAXParserFactory und SAXParser. Diese Klassen wurden von Sun entwickelt, um eine Lücke in SAX1 zu schließen. In SAX2 sind sie unnötig und im Gegenteil sogar gefährlich. Beispielsweise berücksichtigen sie standardmäßig keine Namensräume. SAX2-Anwendungen sollten stattdessen XMLReaderFactory und XMLReader einsetzen.

Alternativ kann man auch explizit einen bestimmten Parser auswählen, indem man den Klassennamen als String an die Methode createXMLReader( ) übergibt. So könnte man zum Beispiel den Xerces-Parser starten:

try {
  XMLReader parser = XMLReaderFactory.createXMLReader(
   "org.apache.xerces.parsers.SAXParser");
  // Das Dokument parsen ...
}
catch (SAXException ex) {
  // Erzeugung des XMLReader schlug fehl
}

Wenn ein Parser erst einmal erzeugt worden ist, ist er zum Lesen eines Dokuments bereit. Zum Beispiel kann man einfach den SYSTEM-Identifier des gewünschten Dokuments an die Methode parse( ) übergeben. Der SYSTEM-Identifier ist fast immer eine absolute oder relative URL, die als String kodiert ist. Das folgende Code-Beispiel liest das unter http://www.slashdot.org/slashdot.xml zu findende XML-Dokument:

try {
  XMLReader parser = XMLReaderFactory.createXMLReader(  );
  parser.parse("http://www.slashdot.org/slashdot.xml");
}
catch (SAXParseException ex) {
  // Das Dokument ist nicht wohlgeformt.
}
catch (SAXException ex) {
  // Konnte die Implementierung von XMLReader nicht finden.
}
catch (IOException ex) {
  // Irgendein I/O-Problem hat das komplette Herunterladen des
  // Dokuments vom Server verhindert.
}

Auch die Methode parse( ) wirft eine SAXParseException aus, wenn das Dokument nicht wohlgeformt ist. Eine IOException tritt während des Lesens des Dokuments auf und eine SAXException, wenn irgendetwas anderes schief geht. Ansonsten liefert die Methode keinen Rückgabewert (void). Um vom Parser Informationen über das gewünschte Dokument zu bekommen, muss man ihn deshalb zunächst mit einem ContentHandler versehen.

   

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de