prev up next


Simple API für XML - SAX

Die Simple API für XML (SAX) wurde von Mitgliedern der XML-DEV Mailing List [Gopr2000] entwickelt. Mit SAX wird ein Dokument eventgesteuert geparst, d.h. es wird beim Lesen eines Tags ein Ereignis ausgelöst, ebenso bei Fehlern oder Warnungen. Diese Ereignisse können vom Entwickler individuell behandelt werden, indem ein Eventhandler implementiert und beim Parser registriert wird. Innerhalb des Eventhandlers wird für die einzelnen Ereignisse eine Methode implementiert, über die man dann auf das Ereignis reagieren kann. Nach der Verarbeitung eines Ereignisses sind alle Informationen dazu verloren, sofern diese nicht explizit zwischengespeichert wurden. In der Abbildung 8 ist der Zusammenhang zwischen einem XML-Dokument und den zugehörigen Ereignissen dargestellt.


Abbildung 8: SAX-Parser-Events beim Parsen eines XML-Dokumentes

Wie man einen SAX-Parser verwendet, wird anhand des Apache-Xerces-J Parsers erklärt. Zunächst muß die Klasse org.apache.xerces.parsers.SAXParser importiert werden, um mit

SAXParser parser = new SAXParser();
einen neuen SAX-Parser zu instanziieren. Damit die durch das Parsen entstehenden Ereignisse verarbeitet werden können, muß dem Parser ein Handler, der für die Ereignisse entsprechende Methoden enthält, übergeben werden. Dieser Handler muß von der Klasse org.xml.sax.helpers.DefaultHandler abstammen. Indem die Methoden des DefaultHandlers für die einzelnen Ereignisse überschrieben werden, kann man die Ereignisse individuell verarbeiten. Ein einfacher Handler, der lediglich die Ereignisse auf die Kommandozeile ausgibt, ist in Quellcode 3.4.1 zu sehen.

MySAXHandler.java: Handler zur Ausgabe der Ereignisse eines SAX-Parsers

import org.xml.sax.helpers.DefaultHandler;

public class MySAXHandler extends DefaultHandler {
  // DocumentHandler methods

  /** Processing instruction. */
  public void processingInstruction(String target,
                                    String data) {
    System.out.println("Processing Instruction:"
                      +"<?"+target+data+"?>");
  }

  /** Start document. */
  public void startDocument() {
    System.out.println("Start Dokument:");  
  }

  /** Start element. */
  public void startElement(String uri, String localName, 
                           String qName, Attributes attrs) {
    System.out.println("Start Element: <"+qName+">");
  }

  /** Characters. */
  public void characters(char ch[],
                         int start,
                         int length) {
    System.out.println("Characters: "
                       +new String(ch, start, length));
  }
  
  /** Ignorable whitespace. */
  public void ignorableWhitespace(char ch[],
                                  int start,
                                  int length) {
    characters(ch, start, length);
  }

  /** End element. */
  public void endElement(String name) {
    System.out.println("End Element: </"+name+">");
  }

  /** End document. */
  public void endDocument() {
    System.out.println("End of Document");
  }
}

Dieser Handler wird dann folgendermaßen dem SAX-Parser mitgeteilt:

parser.setContentHandler(myHandler);
Die Erstellung eines Errorhandlers, das Einstellen der Features und das Initiieren des Parsens sind identisch zu dem DOM-Parser und werden deshalb hier nicht nochmals erläutert.
prev up next