SAX2

SAX2

Die Simple API for XML (SAX) ist ein De-facto-Standard, der ein Application Programming Interface (API) zum Parsen von XML-Daten beschreibt. Die aktuelle Hauptversion SAX 2.0 wurde 2000 von David Megginson veröffentlicht und ist Public Domain. Ein SAX-Parser liest XML-Daten als sequentiellen Datenstrom und ruft für im Standard definierte Ereignisse vorgegebene Rückruffunktionen (callback function) auf. Eine Anwendung, die SAX nutzt, kann eigene Unterprogramme als Rückruffunktionen registrieren und auf diese Weise die XML-Daten auswerten.

Inhaltsverzeichnis

Arbeitsweise von SAX

SAX wurde ursprünglich in Java entwickelt und besteht aus einer Anzahl von Java-Interfaces, heute finden sich jedoch Implementierungen für nahezu alle gängigen Programmiersprachen. SAX unterliegt, untypischerweise für XML-spezifische Spezifikationen, keinem formalen Komitee oder Konsortium, dennoch ist SAX ein De-facto-Standard. Es spezifiziert eine Menge von Methoden für den Zugriff auf XML-Dokumente mittels eines SAX-Parsers. SAX arbeitet, anders als DOM, ereignisorientiert. Das Verarbeitungsprinzip entspricht dem Konzept einer Pipeline. SAX definiert eine Menge von Ereignissen, die beim sequentiellen Lesen eines XML-Dokuments vorkommen können. Diese Ereignisse sind zustandslos, sie referenzieren nicht auf andere, vorhergegangene Ereignisse und stehen auch sonst in keinem Verhältnis zu anderen Ereignissen. Beim Erkennen einer syntaktischen Struktur startet der SAX-Parser eine Behandlungsroutine, welche gegebenenfalls eine individuelle Behandlungsroutine des Ereignisses ausführt.

Hierdurch kann mit dem Einlesen der ersten Zeichen bereits mit der Auswertung des Dokuments begonnen werden. Dies verkürzt insbesondere in interaktiven Systemen die subjektiv gefühlte Zugriffszeit. Gleichzeitig minimiert der SAX-Parser den Speicherbedarf, da neben dem jeweils eingelesenen Element nur solche Daten im Speicher stehen, die mittels einer Behandlungsroutine explizit ausgewählt wurden. SAX-Ereignisse werden parallel zum Einlesen des Dokuments in den Parser ausgeworfen. In der Praxis bedeutet dies, dass es SAX-Ereignisse auf nicht wohlgeformte XML-Dokumente geben kann, bevor das Dokument als ungültig erkannt wird. Daher spielt die Fehlerbehandlung bei SAX-Parsern eine wichtige Rolle, entsprechende Klassen stehen in Java zur Verfügung. Das Validieren eines XML-Dokuments vor dem Parsen mit SAX widerspricht der Natur von SAX, da hierfür zunächst das gesamte Dokument in den Speicher geladen werden muss. Dennoch findet sich eine Vielzahl validierender SAX-Parser.  

Ereignisse in SAX

Gegeben sei folgendes Dokument:

<?xml version="1.0"?>
<seminararbeit>
	<titel>DOM, SAX und SOAP</titel>
	<inhalt>
		<kapitel value="1">Einleitung</kapitel>
		<kapitel value="2">Hauptteil</kapitel>
		<kapitel value="3">Fazit</kapitel>
	</inhalt>
</seminararbeit>

Wird das gezeigte XML-Dokument mit Hilfe eines SAX-Parsers gelesen, wirft dieser folgende Ereignisse aus:

startDocument()
startElement("seminararbeit",[])
startElement("titel",[])
character("DOM, SAX und SOAP")
endElement("titel")
startElement("inhalt",[])
startElement("kapitel", ["value="1""])
character("Einleitung")
endElement("kapitel")
...

Bei jedem Ereignis unterbricht der Parser seine Arbeit und wartet darauf, dass er vom Dokument-Handler die Arbeitserlaubnis zurückbekommt. Dieser kann in der Zwischenzeit zur Auswertung des Ereignisses eine Behandlungsroutine starten. Dabei müssen jedoch nur für solche Ereignisse Behandlungsroutinen geschrieben werden, die für die weitere Verarbeitung auch von Interesse sind – ansonsten wird die Kontrolle sofort wieder an den Parser zurückgegeben.

Arbeiten mit SAX

Beispiel in Java

Im folgenden Beispiel in Java soll im Rahmen einer Dokumentenanalyse der Titel und die Anzahl der Kapitel ausgelesen und am Ende ausgegeben werden. Dafür müssen zunächst entsprechende SAX-Klassen importiert werden und der SAX-Parser initialisiert werden. Zusätzlich muss ein Dokument-Handler gestartet werden, der über die Ereignisse vom Parser informiert wird. Dieser Dokument-Handler beinhaltet für das Beispiel folgende Methoden für die Ereignisse „character“, „startElement“ und „endDocument“:

public int count = 0;
public boolean titel = false;
public String seminarbeit = "";

public void character(String value) throws SAXException {
	if (titel == true && seminarbeit.equals(""))  {
		seminarbeit = value;
		titel = false;
	}
}

public void startElement(String name, AttributeList atts) throws SAXException {
	if (name.equals("kapitel")) ++count;
	if (name.equals("titel")) titel = true;
}

public void endDocument() throws SAXException {
	System.out.println(seminarbeit + " enthält " + count + " Kapitel");
}

Beispiel in Lua

In LuaExpat[1] (Lua mit einem SAX-Parser) werden für das Parsen von XML-Dateien zunächst sogenannte „Callbacks“ vorbereitet, mit denen der Parser nach seinem Daten an das ihn aufrufende Anwendungsprogramm übergeben kann. Im Beispiel sind das einfache Aufrufe von Ausgabefunktionen. Das folgende Programm gibt eine XML-Datei als einfachen Text aus.

require "lxp"
xml_file="irgendeineXMLdatei.xml"

do
  local count = 0
  callbacks = {
    StartElement = function (parser, name, attributes)
      -- StartTag ausgeben--
      io.write("+ ", string.rep(" ", count*2), name, "\n")
      count = count + 1
      -- Attribute ausgeben --
      local attributename
      for _,attributename in ipairs(attributes) do
        io.write("  ", string.rep(" ", count*2),attributename,'="',attributes[attributename],'"\n')
      end
    end,
    EndElement = function (parser, name)
      -- Endtag ausgeben --
      count = count - 1
      io.write("- ", string.rep(" ", count*2), name, "\n")
    end,
    CharacterData = function (parser, text)
      -- Text ausgeben --
      io.write("----------\n",text, "\n----------\n")
    end
  }
end

p = lxp.new(callbacks)          -- Generiere eine Instanz des Parsers
file = assert(io.open(xml_file .. "","r"))
p:parse(file:read("*all"))      -- Parsen der gesamten Datei
                                -- (Auch zeilenweises Einlesen wäre möglich)
file:close();collectgarbage()

p:parse()         -- Beendet das Dokument
p:close()         -- Schließt den Parser

Quellen

  1. http://www.keplerproject.org/luaexpat/

Literatur

  • David Brownell: SAX2, O'Reilly, ISBN 0-596-00237-8
  • Helmut Erlenkötter: XML Extensible Markup Language von Anfang an, 2003, ISBN 3-499-61209-7, S.211-229
  • W. Scott Means, Michael A. Bodie: The Book of SAX, No Starch Press, ISBN 1-886411-77-8

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем сделать НИР

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Fortis Saxonia - Sax2 — Sax 1.1 und die Positivform des zu dem Zeitpunkt noch unfertigen Sax2 Fortis Saxonia (lateinisch für Starkes Sachsen) ist ein interdisziplinäres Team von Studenten und Absolventen der TU Chemnitz sowie der FH Mittweida. Ziel ist es, ein leichtes… …   Deutsch Wikipedia

  • Fortis Saxonia — Sax 1.1 und die Positivform des zu dem Zeitpunkt noch unfertigen Sax2 Fortis Saxonia (lateinisch für Starkes Sachsen) ist ein interdisziplinäres Team von Studenten und Absolventen der TU Chemnitz sowie der FH Mittweida. Ziel ist es, ein leichtes… …   Deutsch Wikipedia

  • SaX — Saltar a navegación, búsqueda SaX2 mostrando la configuración de la tarjeta y el monitor SaX (SUSE Automated X configuration), es el configurador de monitor y tarjeta de video de SUSE Linux de Novell y openSUSE. Junto con YaST, son las… …   Wikipedia Español

  • SAX — (Simple API for XML) is a serial access parser API for XML. SAX provides a mechanism for reading data from an XML document. It is a popular alternative to the Document Object Model (DOM). XML processing with SAX A parser which implements SAX (ie …   Wikipedia

  • Sax — (англ. «Simple API for XML») способ последовательного чтения/записи парсеры требуют фиксированного количества памяти для своей работы, но не позволяют изменять содержимое документа. Всё, что делает SAX парсер, это сообщает вызвавшему приложению о …   Википедия

  • Simple API for XML — Die Simple API for XML (SAX) ist ein De facto Standard, der ein Application Programming Interface (API) zum Parsen von XML Daten beschreibt. Die aktuelle Hauptversion SAX 2.0 wurde 2000 von David Megginson veröffentlicht und ist Public Domain.… …   Deutsch Wikipedia

  • SAX — У этого термина существуют и другие значения, см. SAX (значения). SAX (англ. «Simple API for XML»)  способ последовательного чтения/записи XML файлов. Обычно SAX парсеры требуют фиксированного количества памяти для своей работы, но не… …   Википедия

  • openSUSE — KDE 4.7 в openSUSE 12.1 Разработчик Novell, Inc. Семейство ОС …   Википедия

  • zax — var. of SAX(2). * * * ˈzaks noun ( es) Etymology: English dialect, alteration of sax (I) : a tool for trimming and puncturing roofing slates * * * /zaks/, n. a hatchetlike tool for cutting and punching nail holes in roofing slate. [dial. var. of… …   Useful english dictionary

  • Document Object Model — Not to be confused with Domain Object Model. HTML HTML and HTML5 Dynamic HTML XHTML XHTML Mobile Profile and C HTML Canvas element Character encodings Document Object Model Font family HTML editor HTML element HTML Fr …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”