Simple API for XML

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. 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 keinem formalen Komitee oder Konsortium, was für eine XML-Spezifikation eher untypisch ist, 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",[])
character("\n        ");
startElement("titel",[])
character("DOM, SAX und SOAP")
endElement("titel")
startElement("inhalt",[])
character("\n                ");
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 „characters“, „startElement“ und „endDocument“:

public int count = 0;
public boolean titel = false;
public String seminararbeit = "";
 
public void characters(char[] ch, int start, int length) throws SAXException {
 if (titel == true && seminararbeit .equals(""))  {
  seminararbeit = new String(ch, start, length);
  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(seminararbeit + " 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

Literatur

Weblinks

Einzelnachweise

  1. keplerproject.org

Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

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

  • Simple api for xml — Pour les articles homonymes, voir SAX. Simple API for XML ou SAX est une interface de programmation pour de nombreux langages permettant de lire et de traiter des documents XML. L’API SAX est originellement spécifique au langage de programmation… …   Wikipédia en Français

  • Simple API for XML — Pour les articles homonymes, voir SAX. Simple API for XML ou SAX est une interface de programmation pour de nombreux langages permettant de lire et de traiter des documents XML. L’API SAX est originellement spécifique au langage de programmation… …   Wikipédia en Français

  • Simple API for XML — Para otros usos de este término, véase SAX. SAX son las siglas de Simple API for XML , originalmente, una API únicamente para el lenguaje de programación Java, que después se convirtió en la API estándar de facto para usar XML en JAVA. Existen… …   Wikipedia Español

  • Java API for XML Processing — Das Java API for XML Processing, oder JAXP, ist eines der Java XML APIs. Es handelt sich um ein leichtgewichtiges standardisiertes API zum Validieren, Parsen, Generieren und Transformieren von XML Dokumenten. Die jeweilige (nicht standardisierte) …   Deutsch Wikipedia

  • Java API for XML Processing — The Java API for XML Processing, or JAXP (pronounced jaks p ), is one of the Java XML programming APIs. It provides the capability of validating and parsing XML documents. The three basic parsing interfaces are: * the Document Object Model… …   Wikipedia

  • Content repository API for Java — (JCR) is a specification for a Java platform application programming interface (API) to access content repositories in a uniform manner.[1][dead link][2][not in citation given] …   Wikipedia

  • .xml — Extensible Markup Language Extensible Markup Language Extension de fichier .xml Type MIME application/xml, text/xml Développé par World Wide Web Consortium Type de format …   Wikipédia en Français

  • XML — Extensible Markup Language Extensible Markup Language Extension de fichier .xml Type MIME application/xml, text/xml Développé par World Wide Web Consortium Type de format …   Wikipédia en Français

  • Xml — Extensible Markup Language Extensible Markup Language Extension de fichier .xml Type MIME application/xml, text/xml Développé par World Wide Web Consortium Type de format …   Wikipédia en Français

  • XML — Infobox file format name = Extensible Markup Language icon = logo = extension = .xml mime = application/xml, text/xml (deprecated) type code = uniform type = public.xml magic = owner = World Wide Web Consortium genre = Markup language container… …   Wikipedia

Share the article and excerpts

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