Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

Applets

Servlets

Beispiele

  1. Ein- und Ausgabe
  2. Textdateien
  3. Kryptographie
  4. MySQL
  5. DOM
  6. SAX
  7. JDOM

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
09 December 2021
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

SAX

Die Simple API for XML Parsing wird verwendet, wenn XML-Dokumente verarbeitet werden sollen. Ein SAX-Parser ist in JAVA seit der Version 1.4 enthalten.

Im Gegensatz zu DOM lädt SAX nicht das ganze XML-Dokument auf einmal, sondern arbeitet es in einzelnen Teilen ab, in so genannten SAX-Ereignissen. Solche Ereignisse sind beispielsweise:

  • Der Beginn des Dokumentes
  • Das Auftreten eines Anfangstags
  • Das Auftreten des Endetags
  • Das Auftreten eines Attributes
  • ...

Ein XML-Dokument parsen

Ein (beliebiges) XML-Dokument soll geparst werden. Etwaige Fehler in der XML-Datei sollen aufgespürt werden.

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Sax1 extends DefaultHandler {

    public static void main (String args[]) throws Exception {
	Sax1 sax1 = new Sax1();
	sax1.parsen();
    }
    
    public void parsen() throws Exception {
	SAXParserFactory factory = SAXParserFactory.newInstance();
       	// factory.setValidating(true);
	SAXParser parser = factory.newSAXParser();
	XMLReader reader = parser.getXMLReader();
	reader.setContentHandler(this);
	reader.parse("weblinks.xml");
    }

    public void endDocument() throws SAXException {
	System.out.println("weblinks.xml wurde geparst");
    }
}

Innerhalb der Methode parsen() wird zunächst die neue Instanz factory der Klasse SAXParserFactory erzeugt. Sie stellt den XMLParser parser, und dieser den XMLReader reader zur Verfügung. Hier bezieht sich die Methode setContentHandler() auf das aktuelle Klassenexemplar (sax); die Methode parse() arbeitet das angegebene XML-Dokument (weblinks.xml) ab.

Die Klasse Sax1 erweitert die Klasse DefaultHandler aus dem Package org.xml.sax.helpers und überschreibt die Methode endDocument(): Auf diese Weise wird nur am Ende des Parsens, also wenn das Ende des XML-Dokuments erreicht wurde, eine Mitteilung auf die Standardausgabe geschrieben.

In der Tat scheint das obige Code-Beispiel wenig spektakulär, da im Erfolgsfall lediglich folgende Meldung ausgegeben wird:

nus@ice:~/java/xml/sax> java Sax1
weblinks.xml wurde geparst

Der Parser überprüft die angegebene XML-Datei jedenfalls darauf, ob die angegebene DTD existiert und ob die XML-Datei wohlgeformt ist.

Der SAX-Parser kann eine XML-Datei neben dem Test auf Wohlgeformtheit auch auf ihre ?Gültigkeit? hin überprÜfen: Eine XML-Datei heißt gültig, wenn sie eine DTD (Document Type Definition) verwendet. Soll der Parser die XML-Datei gegen die DTD validieren, so ruft man die SAXParserFactory-Methode setValidating() mit dem Wert true auf. Damit wird beispielsweise überprüft, ob jedes <eintrag>-Element genau ein <kategorie>-Element, genau ein <url>-Element, ein oder mehrere <notiz>-Elemente und kein oder ein <datum>-Element enthält. Im Programmtext wurde anstelle der statischen Klassenvariable sax die Referenz this verwendet, die sich auf das aktuelle Klassenexemplar der Methode parsen(), also auf sax bezieht.

Fehlerbehandlung

Das Interface ErrorHandler enthält drei Methoden für verschieden gravierende Fehler: warning(), error() und fatalError(). Durch Überschreiben dieser Methoden können spezifische Fehlermeldungen bzw. eine individuelle Ausgabe der Fehlermeldungen auf einem bestimmten Medium erreicht werden. Voraussetzung ist jedenfalls, dass die Klasse SAXParseException importiert und eine neue Instanz von ErrorHandler erzeugt wurde:

...
import org.xml.sax.SAXParseException;

  public void parsen() throws Exception {
    	SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLReader reader = parser.getXMLReader();
    reader.setContentHandler(this);
    reader.setErrorHandler(this);
    reader.parse("weblinks.xml");
  }
  

Nun können die Fehler-Methoden wunschgemäß überschrieben werden, z.B:

...
  public void warning(SAXParseException e) {
    System.out.println("WARNUNG: " + e);
  }

  public void error(SAXParseException e) {
	System.out.println("ERROR!" + e);
  }

  public void fatalError(SAXParseException e) {
    System.out.println("Schwerwiegender 					Fehler!!!" + e);
  }
  

Die SAXParseExecption-Methoden getLineNumber() und getMessage() geben Auskunft über den Ort und über die Art des Parsefehlers; getSystemId() liefert den Pfad und den Dateinamen der geparsten XML-Datei.

Elemente und Attribute anzeigen

Im Beispiel Sax2.java sollen die Zeichenkettenwerte der Textelemente und Attributwerte ausgegeben werden. Dazu erweitern wir wieder die Klasse DefaultHandler und überschreiben einige Methoden, die sich auf bestimmte SAX-Ereignisse beziehen:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class Sax2 extends DefaultHandler {

  public static void main (String args[]) throws Exception {
    Sax2 sax = new Sax2();
    sax.parsen();
  }

  public void parsen() throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLReader reader = parser.getXMLReader();
    reader.setContentHandler(this);
    reader.parse("weblinks.xml");
  }

  public void startDocument() {
  }

  public void startElement(String nsURI, String localName, String qName, Attributes atts) throws SAXException {
    System.out.print("Element " + qName + ": ");
    if (atts.getValue(0) != null)
      System.out.println("Attribut id : " +
	 atts.getValue(0));
  }

  public void characters(char[] ch, int start, int length) throws SAXException {
   String textelement = new String(ch, start, 	length);
   System.out.print(textelement);
  }

  public void endElement(String nsURI, String localName, String qName) throws SAXException {
    System.out.println();
  }

  public void endDocument() throws SAXException {
    System.out.println("weblinks.xml wurde geparst");
  }
}

Die im obigen Beispiel auftretenden SAX-Ereignisse sind der Beginn des Dokuments, das Auftreten eines Start-Tags, ein Textinhalt, das Auftreten eines Ende-Tags und das Erreichen des Dokumentendes. Aus diesem Grund müssen die Methoden startDocument(), startElement(), characters() und endElement() entsprechend überschrieben werden. Die Methode startElement() gibt die Mitteilung ?Element:?, den Namen des Elementes und ggf. das angegebene Attribut mit seinem Attributwert auf der Konsole aus. Die Methode characters() liefert den Zeicheninhalt eines Elementes in Form eines Arrays, der in Form einer Zeichenkette ausgegeben wird. Die Methode endElement() liefert nur einen Zeilenvorschub auf der Konsole: Element weblinks: Element eintrag: Attribut id : 0 Element kategorie: edv Element url: http://www.w3.org Element notiz: W3-Konsortium Element notiz: Technische Referenz Element eintrag: Attribut id : 1 Element kategorie: phy Element url: http://www.cern.ch Element notiz: Europaeisches Kernforschungszentrum Element notiz: Aktuelles zur Hochenergiephysik Element notiz: Materialien zur Elementarteilchenphysik Element eintrag: Attribut id : 2 Element kategorie: ast Element url: http://www.nasa.gov Element notiz: Amerikanische Weltraumfahrtbehoerde Element notiz: Aktuelle Raumfahrtprojekte Element notiz: Historische Daten ...

Attributes-Methode getValue(index) liefert den Attributwert zum Attribut mit dem angegebenen Index. Im Beispiel tritt nur ein Attribut auf, es hat den Index 0.


© Alfred Nussbaumer, Weblog "MiniNuss"