Ausarbeitung - Fakultät für Mathematik und Informatik

Transcription

Ausarbeitung - Fakultät für Mathematik und Informatik
SAX
Simple API for XML
Seminararbeit im Seminar
XML und Datenbanken“
”
Sommersemester 2004
Universität Jena
vorgelegt von
Stefan Scheidewig
Mai 2004
1
Inhaltsverzeichnis
1 Einleitung
3
2 Simple API for XML (SAX)
4
2.1 Baumbasiert vs. Ereignisbasiert . . . . . . . . . . . . . . . . . 5
2.2 Die Funktionsweise von SAX . . . . . . . . . . . . . . . . . . . 6
2.3 Validierung mit SAX . . . . . . . . . . . . . . . . . . . . . . . 11
3 Vorteile und Nachteile von SAX
14
4 SAX-Parser
15
5 Zusammenfassung
16
A Wichtige Internetadressen
17
B Abkürzungen und Akronyme
17
Literaturverzeichnis
18
2
1
Einleitung
Wozu werden Parser benötigt? Um diese Frage zu beantworten, betrachten
wir vorerst die Definition eines Parsers. Im Brockhaus der Computer und
Informationstechnologie([Bro02]) steht:
Ein Parser ist . . . ein Programm, das Dokumente oder Programmquelltext
”
nach vorgegebenen Kriterien syntaktisch analysiert und in einzelne Bestandteile aufgliedert. . . . Ein Parser für Dokumente in XML oder XSL hat die
Aufgabe, die Struktur der vorgegebenen Dokumente zu analysieren und die
Daten zu einer neuen HTML-Seite zusammenzufügen, sodass sie mit einem
normalen Web-Browser angesehen werden können. 1
Ein Parser ist also ein Programm, welches als Eingabe ein beliebiges Dokument erhält und dieses auf Korrektheit bezüglich der dem Parser bekannten
Dokumentstruktur prüft und in die syntaktischen Einheiten aufgliedert.
Anwendung
API
Parser
Dokument
Abbildung 1: Der Parser liegt zwischen Anwendung und Dokument
Dabei ist also ein XML-Parser ein Hilfsprogramm für eine bestimmte An1
Doch anders als in der Definition des Brockhaus angegeben, ist ein XML-Parser nicht
dazu da, ein XML-Dokument für einen Web-Browser darstellungsfähig zu machen. Dies
ist lediglich der Nutzen, den eine Anwendung aus der Arbeit eines XML-Parsers zieht.
3
wendung und ist daher zwischen einer Anwendung und einem auszulesenden XML-Dokument zu finden (siehe Abbildung 1). Damit nun eine Anwendung den Parser steuern kann, wird dem Anwendungsprogrammierer eine sogenannte API (Application Programming Interface) zur Verfügung gestellt,
was im Grunde nichts anderes darstellt als eine Funktionsbibliothek, um die
Steuerung zu bewerkstelligen.
Als jedoch das World Wide Web Consortium (W3C) 1998 XML1.0 als Standard empfahl, wurde jedoch nichts über eine solche Schnittstelle ausgesagt
und so kam es in der Anfangszeit zu einer Vielfalt von verschiedenen APIs.
Das Problem dieser Vielfalt war, dass sich die Anwendungsprogrammierer auf
keinen Standard verlassen konnten und ihre Anwendung für einen bestimmten Parser schreiben mussten. Hatten sie sich für einen anderen, eventuell
besseren Prozessor entschieden, so mussten sie entweder das Programm mit
viel Aufwand umschreiben oder ganz die Finger von diesem Vorhaben lassen.
2
Simple API for XML (SAX)
Dieses Problem wurde schnell erkannt. Unter anderem von Peter MurrayRust, der im Dezember 1997, also noch vor der offiziellen Empfehlung von
XML, eine Diskussion mit Tim Bray2 und David Megginson3 in der MailingListe xml-dev startete, wie man denn Anwendungen von der Unterschiedlichkeit der einzelnen Parser schützen könnte. Die Resonanz war enorm und
David Megginson koordinierte und leitete die Implementierung der Funktionsspezifikation unter dem Arbeitstitel Yet Another XML Parser API“ kurz
”
YAXPAPI unter der ebenfalls zu dieser Zeit boomenden Programmiersprache Java.
Es dauerte nur einen Monat als im Januar 1998 die erste Implementation
fertig war und in Umlauf gebracht wurde unter dem Namen Simple API
”
for XML 1.0“ (SAX1.0). Weitere Diskussionen und Verbesserungen folgten,
bis schließlich im Mai 1998 die endgültige Fassung freigegeben4 wurde.
Mittlerweile befindet sich SAX in der Version 2.0.25 und ist ein anerkannter
de facto-Standard, obgleich SAX nie vom W3C vorgeschlagen wurde.
Aber wieso konnte sich SAX als Standard durchsetzen? Um diese Frage zu
2
Autor des LARK XML Parsers
Autor des Aelfred XML Parsers
4
Jon Bosak, der Entwickler von XML, gestatte die Verwendung von der Domain xml.org
für das Paket org.xml.sax
5
Dieses Bugfix-Release 2.0.2 unterstützt jetzt die XML1.1 und Namespaces1.1 Standards
3
4
beantworten, muß man die Funktionsweise von SAX erklären.
2.1
Baumbasiert vs. Ereignisbasiert
Es gibt zwei anerkannte Arten von XML-APIs:
• baumbasierte und
• ereignisbasierte
Bei baumbasierenden APIs werden XML-Dokumente im Speicher als Baum
entsprechend ihrer logischen Struktur abgebildet, was bei großen XML-Dokumenten zu enormer Speicherauslastung führen kann. Der Vorteil ist, das
der Anwender die Struktur sehr leicht ändern kann und wieder als -Datei
festschreiben kann.
Das Prinzip einer ereignisbasierten API hingegen besteht dabei, ein gegebenes XML-Dokument von Anfang bis Ende zu durchlaufen und Ereignisse bei
der Anwendung auszulösen bei Auftreten von XML-spezifischen Konstrukten, wie der Beginn des Dokuments, der Beginn eines Elements oder der
Inhalt eines Markup-Paares (siehe Abbildung 2).
Anwendung
SAX
SAX Parser
XML−
<doc>
Dokument
Abbildung 2: Markup Elemente rufen Ereignisse hervor
5
Dadurch werden die einmal gelesenen Elemente nach dem Lesen gleich wieder
aus dem Fokus verloren und so ist der Gesamtüberblick über die Struktur
des XML-Dokuments nicht gegeben.
Aber wie genau funktioniert dies bei SAX und was sind dessen Vorteile und
Nachteile?
2.2
Die Funktionsweise von SAX
Die Entwicklung der Technologie XML fand parallel zu der der Programiersprache Java statt. Die Entwickler von SAX wählten zur Implementierung
ihrer Parser-Schnittstelle diese zu der Zeit schon populäre Programmiersprache. SAX ist zwar in vielen anderen bekannten Hochsprachen implementiert,
aber auch meine Veranschaulichung soll mit Java geschehen.
Um nun ein Dokument parsen zu wollen, steht dem Programmier ein sogenannter event handler zur Verfügung. Dies sind Methoden, die von dem
Parser, welcher im Parsing Prozess der aktive Teilnehmer ist, bei Eintreten
eines Ereignisses wie Beginn eines Elementes“ in der Anwendung aufgeru”
fen werden. Bevor dies aber geschehen kann, muss vom Programmier noch
deklariert werden, was beim Aufruf der Methode geschehen soll. Die Anwendung muss also, wenn der Parsing Prozess durch die Anwendung gestartet
wurde, auf die Ereignisse reagieren. Diese Methoden, nennt man daher auch
die Callback-Methoden. Als Methodenargumente übergibt der Parser der Anwendung zum Beispiel den Namen des Elements oder etwa den Inhalt, womit
die Anwendung dann unter anderem arbeiten kann.
Nehmen wir zur Verdeutlichung folgende XML-Datei als Beispiel:
<hardwaredb>
<geraet id="J15628232">
<typ>Monitor</typ>
<name>Yakumo 17"-Monitor 796N High Resolution</name>
<hersteller>Yakumo</hersteller>
<haendler>Redlich-EDV</haendler>
<preis>100,00</preis>
<kaufdatum>19.06.1999</kaufdatum>
<standort>
<zimmer>3333</zimmer>
<lehrstuhl>DBIS</lehrstuhl>
<fakultaet>Mathematik und Informatik</fakultaet>
</standort>
<zustaendig>Horst Bommer</zustaendig>
<reperaturen>
<reperatur nr="N1">
<durchgefuehrt_von>Karl Meier</durchgefuehrt_von>
<datum>23.05.2002</datum>
<beschreibung>
neues Monitorkabel
</beschreibung>
6
</reperatur>
</reperaturen>
<eigenschaften>
<groesse>17</groesse>
<gewicht>15</gewicht>
<max_aufloesung>1600x1200/75</max_aufloesung>
<hfrequenz>30-98</hfrequenz>
<vfrequenz>50-160</vfrequenz>
<pixelabstand>0,25</pixelabstand>
</eigenschaften>
</geraet>
</hardwaredb>
Dies ist ein Beispiel für eine Hardware-Datenbank einer Universität. Um die
Übersichtlichkeit zu wahren, habe ich nur einen Monitor aufgenommen.
Damit nun ein XML-Dokument von einem SAX-Parser ordentlich geparst
werden kann, muß das Dokument wohlgeformt“ sein. Dies bedeutet, daß es
”
ein Wurzelelement (auch document element genannt) besitzt, dessen Kindelemente beliebig tief geschachtelt werden können, jedoch aus einem Start- und
Endtag bestehen (Markup-Paar) müssen, die sich nicht überlappen dürfen.
Außerdem dürfen innerhalb des öffnenden Elementtags beliebig viele Elementattribute stehen die ihre Werte durch =¨Attributwert¨“erhalten.
”
Um jetzt ein XML-Dokument parsen zu können, muß man einen SAX-Parser
auf dem ausführenden Rechner installiert haben. Dabei besteht eine relativ
große Auswahl an Parsern, die ich später noch erläutern werde. Für mein Beispiel habe ich Xerces “verwendet aus dem Hause Apache. Um den Parser
”
benutzen zu können, muss man zunächst den Java CLASSPATH auf die installierten jar-Dateien aufmerksam machen und in der java-Datei den Parser
mit
import org.apache.xerces.parsers.SAXParser;
verfügbar machen.
Im nächsten Schritt muß man den ContentHandler, also das eigentliche reagierende Element, generieren. Dazu gibt es 2 Möglichkeiten in der SAX-API.
Entweder man benutzt die Klasse org.xml.sax.ContentHandler, bei der für jedes Ereignis vom Programmierer festgelegt werden muss, was zu tun ist oder
man verwendet den zur Verfügung gestellten DefaultHandler
(org.xml.sax.helpers.DefaultHandler), der dem Programmierer die Arbeit erleichtert indem er für jedes Ereignis sogenannte no-ops-Methoden“ (Me”
thoden ohne jegliche Funktion) bereitstellt und der Programmierer die nur
für ihn wichtigen Ereignissmethoden neu definiert (zum Beispiel den Beginn
7
eines Elementes, für die Suche nach einem bestimmten Element im Dokument). Der Übersichtlichkeit und Einfachheit halber habe ich mich für den
DefaultHandler entschieden.
Für das Beispielprogramm müssen also folgende Klassen importiert werden:
import
import
import
import
import
import
java.io.FileReader;
org.xml.sax.XMLReader;
org.xml.sax.InputSource;
org.xml.sax.Attributes;
org.xml.sax.helpers.DefaultHandler;
org.apache.xerces.parsers.SAXParser;
Die Klasse FileReader wird, wie der Name schon suggeriert, zum Auslesen
einer Datei benötigt. XMLReader stellt die Instanz des eigentlichen Parsers
dar (und ersetzt die Klasse XMLParser von SAX 1.0). InputSource wiederum
wird benötigt als Eingabestrom für den Parser und Attributes um mit den
Elementattributen arbeiten zu können. Und schließlich stellt Defaulthandler
den Event Handler für den Parser dar. Um den DefaultHandler benutzen zu
können, muß die eigene Klasse diesen implementieren und auch einen Konstruktor bereitstellen, der mit super() den Konstruktor von DefaultHandler
benutzt:
public class SAXbeispiel extends DefaultHandler
{
public static void main (String args[])
throws Exception
{
XMLReader xmlreader = new SAXParser();
SAXbeispiel handler = new SAXbeispiel();
xmlreader.setContentHandler(handler);
FileReader fr = new FileReader(args[0]);
xmlreader.parse(new InputSource(fr));
}
}
public SAXbeispiel()
{
super();
}
Die Klasse SAXbeispiel erbt also alle no-op-Methoden der Klasse DefaultHandler. Im Hauptprogramm wird nun der Xerces Parser initialisiert und
erhält den Namen xmlreader. Als nächstes wird der Event Handler generiert
und benutzt dafür den Konstruktor SAXbeispiel(). Dem Parser wird nun folgend der Handler übergeben, der sagt, was bei bestimmten Ereignissen zu
tun ist.
8
Als nächstes wird die Datei zum Lesen vorbereitet und der Name der Datei
erhält der FileReader aus dem 1. Argument des Programmaufrufs. Diese Datei muß nur noch dem Parser als Eingabestrom mit InputSource verfügbar
gemacht werden und der Parser wird mit diesem als Eingabe gestartet. Dabei
wird der Parser aktiv und ruft Ereignisse hervor, bei dem unser Programm
reagieren muß. Beim Aufruf der Hardwaredatenbank sieht das grob folgendermaßen aus:
startDocument
startElement:hardwaredb
<hardwaredb>
startElement:gerät
<gerät id="1562−8232">
startElement:typ
characters:Monitor
<typ>Monitor</typ>
endElement:typ
startElement:name
<name>Yakumo 17"−Monitor 796N High Resolution</name>
characters:Yakumo ... Resolution
endElement:name
startElement:hersteller
characters:Yakumo
<hersteller>Yakumo</hersteller>
endElement:hersteller
startElement:händler
characters:Redlich−EDV
<händler>Redlich−EDV</händler>
endElement:händler
endElement:hardwaredb
</hardwaredb>
endDocument
Abbildung 3: Ereignisse beim Parsen des XML-Dokuments
Da die XML-Datei in einer leserlichen eingerückten Form geschrieben wurde,
werden eigentlich auch character-Ereignisse ausgelöst, beim Lesen des new
line-Zeichens. Um dies zu verhindern, müssen alle Elemente in unleserlicher,
sequentieller Art und Weise im Dokument abgelegt werden.
Wird nun der Parser mit dem obigen Programmcode gestartet, werden zwar
die Ereignisse ausgelöst aber keineswegs behandelt. Damit dies geschieht,
müssen die gewünschten Ereignismethoden des DefaultHandlers überschrieben werden. Zur Veranschaulichung werden die fünf häufigsten Ereignismethoden mit einfachen Ausgabemethoden überschrieben:
public void startDocument ()
{
System.out.println("startDocument");
}
public void endDocument ()
{
System.out.println("endDocument");
9
}
public void startElement (String uri, String name,
String qName, Attributes atts)
{
System.out.println("startElement: " + name);
}
public void endElement (String uri, String name, String qName)
{
System.out.println("endElement: " + name);
}
public void characters (char[] ch, int start, int length)
{
System.out.print("characters: ");
for(int i=start; i<(length+start); i++)
{
System.out.print(ch[i]);
}
System.out.println();
}
Mit diesen neuen Ereignismethoden erhalten wir, falls das Beispiel XML-Dokument in sequentieller Form vorliegt, die folgende Ausgabe:
startDocument
startElement: hardwaredb
startElement: geraet
startElement: typ
characters: Monitor
endElement: typ
startElement: name
characters: Yakumo 17"-Monitor 796N High Resolution
endElement: name
startElement: hersteller
characters: Yakumo
endElement: hersteller
startElement: haendler
characters: Redlich-"-EDV
endElement: haendler
.
.
.
endElement: geraet
endElement: hardwaredb
endDocument
Dies ist nur ein einfaches Beispiel, aber es verdeutlicht die Mächtigkeit der
SAX-Schnittstelle, da der Programmierer nicht auf eine bestimmte Datenstruktur angewiesen ist, sondern seine eigene benutzerdefinierte Datenstruktur verwenden kann. Zudem ist SAX durch seine Callback-Technologie sehr
gut geeignet für den Einsatz in verteilten Systemen.
10
Doch das Beispielprogramm macht nur einen kleinen Teil der Funktionalität
der SAX-Schnittstelle deutlich. Geht man davon aus, daß die zu parsenden XML-Dokumente nicht maschinell erstellt worden wären, so müßte man
eventuelle Fehler im XML-Dokument abfangen (durch die Klasse SAXExceptions). Außerdem beherrscht SAX seit Version 2.0 auch die Validierung
eines XML-Dokuments, also auch die Prüfung auf Korrektheit bezüglich einer gegebenen DTD oder eines XML-Schemas. Dies will ich anhand meines
Beispiels im nächsten Kapitel verdeutlichen sowie weitere Fähigkeiten der
SAX-Schnittstelle aufzählen.
2.3
Validierung mit SAX
Wie bereits erwähnt, benötigt man zur Validierung (oder auch Validation)
entweder eine DTD oder ein XML-Schema oder etwaige vergleichbare Schablonen für XML-Dokumente. Ich will die Validierung mit einer DTD verdeutlichen.
Selbstverständlich wird durch diese zusätzliche Funktion auch mehr Zeit zum
Parsen eines XML-Dokuments benötigt und ist deswegen nur sinnvoll, wenn
die Dokumente aus unzuverlässigen Quellen stammen und nicht maschinell
erstellt wurden.
In einer DTD werden, ähnlich der Relationenschemata im Relationalem Modell, die Entitäten eines XML-Dokuments, sowie Dateninhalte und sonstige
Integritätsbedingungen angegeben. Die Aufgabe eines validierenden SAX-Parsers ist es dann, zu prüfen, ob die Datentypen, Elementnamen und Aufbau
des vorliegenden XML-Dokuments mit dem der DTD übereinstimmt. Eine
DTD für meine Hardware-Datenbank könnte dann folgendermaßen aussehen:
<!ELEMENT hardwaredb (geraet*)>
<!ELEMENT geraet (typ,name,hersteller,haendler,
preis,kaufdatum,standort,zustaendig,
reperaturen,eigenschaften)>
<!ATTLIST geraet id ID #REQUIRED>
<!ELEMENT typ (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT hersteller (#PCDATA)>
<!ELEMENT haendler (#PCDATA)>
<!ELEMENT preis (#PCDATA)>
<!ELEMENT kaufdatum (#PCDATA)>
<!ELEMENT standort (zimmer,lehrstuhl,fakultaet)>
<!ELEMENT zimmer (#PCDATA)>
<!ELEMENT lehrstuhl (#PCDATA)>
<!ELEMENT fakultaet (#PCDATA)>
<!ELEMENT reperaturen (reperatur*)>
<!ELEMENT reperatur (durchgefuehrt_von,datum,beschreibung?)*>
<!ATTLIST reperatur nr ID #REQUIRED>
<!ELEMENT durchgefuehrt_von (#PCDATA)>
<!ELEMENT datum (#PCDATA)>
<!ELEMENT beschreibung (#PCDATA)>
11
<!ELEMENT eigenschaften (groesse,gewicht,
max_aufloesung,hfrequenz,vfrequenz,
pixelabstand)>
<!ELEMENT groesse (#PCDATA)>
<!ELEMENT gewicht (#PCDATA)>
<!ELEMENT max_aufloesung (#PCDATA)>
<!ELEMENT hfrequenz (#PCDATA)>
<!ELEMENT vfrequenz (#PCDATA)>
<!ELEMENT pixelabstand (#PCDATA)>
Um diese DTD in mein Dokument einzubinden muß ein sogenannter Prolog
am Anfang des XML-Dokumentes eingefügt werden:
<?xml version="1.0" encoding="ISO-8859-1"?>
Zusätzlich müssen die DTD-Regeln angegeben werden. Dies kann entweder
intern innerhalb des XML-Dokuments geschehen oder extern als Verweis auf
eine allgemeine DTD. Dabei kann man mit dem Attribut PUBLIC auf eine
DTD im Internet beziehungsweise Intranet verweisen oder mit SYSTEM
auf eine lokale. Für mein Beispiel habe ich eine Datei lehrstuhl hardware.dtd
erstellt und mit SYSTEM eingebunden:
<!DOCTYPE hardwaredb SYSTEM "lehrstuhl_hardware.dtd">
Damit der Parser die Validierung einsetzt, muß diese aktiviert werden. Da
nicht jeder SAX-Parser notwendigerweise ein validierender Parser sein muß,
ist dies ein sogenanntes Feature eines Parsers. Neben diesen Features gibt
es noch spezielle definierte Objekte, sogennante Properties. Um die Features und Properties eines Parser zu aktivieren beziehungsweise zu deaktivieren, existieren in SAX die setFeature()- beziehungsweise setProperty()Methoden (Natürlich existieren auch die entsprechenden Abfrage-Methoden
getFeature() sowie getProperty()). Falls man Eigenschaften eines Parser aktivieren will, die gar nicht existieren, dann wird entweder eine SAXNotRecognizedException oder eine SAXNotSupportedException geworfen (also entweder ist die Eigenschaft nicht bekannt oder sie wird nicht unterstützt). In
unserem Fall also aktivieren wir die Validierungseigenschaft:
xmlreader.setFeature("http://xml.org/sax/features/validation", true);
Dazu gibt man eine eindeutige URL (die eigentlich keine wirkliche URL darstellt, sondern nur den Eigenschaftsnamen) an sowie true zur Aktivierung
beziehungsweise false zur Deaktivierung. Neben der Validierung kann für
einen SAX-Parser zusätzlich noch mit
12
http://xml.org/sax/features/namespaces
die Verwendung von Namespaces ein- beziehungsweise ausgeschalten werden.
Bei Aktivierung von
http://xml.org/sax/features/namespace-prefixes
läßt sich das Namespace-Präfix den Namen, welche an die Anwendung gesendet werden, voranstellen und mit
http://xml.org/sax/features/external-general-entities
lassen sich externe Entitäten mit einbeziehen.
Ausserdem lassen sich auch 2 Objekte durch
http://xml.org/sax/properties/xml-string
und
http://xml.org/sax/properties/dom-node
aktivieren, wobei das erste Nur-Lese-Strings des ausgelösten Callbacks und
das zweite den Parser auf einen zugrunde liegenden DOM-Baum einstellt.
Beim erneuten Parsen werden nun Fehlermeldungen ausgegeben, falls das
Dokument nicht der angegebenen DTD entspricht. Lässt man zum Beispiel
ein nötiges Element weg, erscheint die Fehlermeldung (zum Beispiel das Element typ):
[Error] :32:14: The content of element type "geraet" must match
"(typ,name,hersteller,haendler,preis,kaufdatum,standort,
zustaendig,reperaturen,eigenschaften)".
Dabei jedoch bricht das Programm nicht ab. Der Durchlauf bricht nur bei
schwerwiegenden Fehlern (fatal errors) ab (wie etwa bei fehlender Wohlgeformtheit), bei Warnungen (warnings treten zum Beispiel bei nicht erkannten
Zeichen auf) und Fehlern (errors erscheinen, wenn die XML-Datei nicht der
DTD oder dem XML-Schema entspricht) läuft der Parser weiter.
Nachdem nun die Funktionsweise der Schnittstelle demonstriert wurde, sollen im nächsten Abschnitt die Vorteile und Nachteile der SAX-Schnittstelle
durchleuchtet werden.
13
3
Vorteile und Nachteile von SAX
Der größte aller Vorteile6 der SAX-Schnittstelle ist sicherlich dessen Geschwindikeit und Leichtgewichtigkeit mit der das Parsen der XML-Dokumente vollzogen wird (daher wird SAX auch besonders eingesetzt zum Suchen in
großen XML-Dokumenten). Durch diesen Vorteil ist SAX auch sehr gut als
Prozessfilter geeignet.
Da bei SAX ein XML-Dokument einmalig von Anfang bis Ende gelesen wird,
ist es auch hervorragend geeignet zum Einlesen von XML-Dateien in eine Datenbank. Man kann sich dabei XML-Dateien als standardisierte Schnittstelle
zwischen verschiedenen Datenbanksystemen vorstellen. Dabei ist ein direkter
Datenaustausch zwischen zwei Servern denkbar ohne Zwischenspeicherung
ähnlich Abbildung 4.
Primergy
Primergy
Datenaustausch über XML
DB−Server I
DB−Server II
Abbildung 4: Austausch unterschiedlicher DB-Systeme mit XML und SAX
Die Möglichkeit große XML-Dokumente lesen zu können ohne viel Speicher
dafür hergeben zu müssen, eröffnet ermöglicht auch dem Markt der mobilen
Endgeräte mit XML-Dokumenten arbeiten zu können.
Aber wie auch bereits erwähnt, dient diese flexible API auch Programmierern
sich nicht auf eine vorgeschriebene Datenstruktur festlegen zu müssen. Da
die Ereignisse so vorkommen, wie sie auch tatsächlich im XML-Dokument
stehen, wird den Programmierern die Möglichkeit eingeräumt, ihre eigene
Objektvisualisierung (z. B. Teilausschnitte) zu schaffen.
Und beinahe jeder Programmierer kann SAX in seiner Lieblingssprache benutzen, da bisweilen Portierungen für jede größere Programmiersprache zur
Verfügung stehen (u.a. Java, C++, Perl, Python).
Sieht die Anwendung jedoch vor, daß das gesamte Dokument im Speicher
sein muß, so ist SAX die ungeeignetere Wahl (und DOM vorzuziehen).
6
Eine Auflistung aller Vor- und Nachteile von SAX sowie ein Vergleich zwischen SAX
und DOM kann der Leser in [Sal02] nachlesen
14
Doch auch das Prinzip des sequentiellen Durchlaufs ist für manche Anwendung nicht empfehlenswert, da lediglich nur auf einzelne Daten zugegriffen
werden kann und einmal betrachtete Daten nicht noch einmal in den Fokus
geraten. Ein wahlfreier Zugriff ist somit nicht gegeben.
Doch man kann sehr leicht erkennen, daß die Vorteile die Nachteile überwiegen und vor allem die Performance, die in der Datenbankwelt so wichtig ist,
ist ein entscheidender Faktor dafür, daß sich SAX zu einem Quasi-Standard
entwickelt hat. Umso mehr wurde auch bei einigen Firmen auf die Entwicklung von SAX-Parsern gesetzt, von denen einige vorgestellt werden sollen.
4
SAX-Parser
Neben dem im Beispiel verwendeten Xerces Parser von Apache, hat auch
IBM einen SAX-Parser mit dem Namen xmlj4 herausgebracht, der auf dem
Xerces-Parser basiert und somit in Java auch mit
org.apache.xerces.parsers.SAXParser eingebunden werden kann, falls er im
System installiert ist. Auch SUN Microsystems haben ihren eigenen SAXParser entwickelt, der seit dem JDK 1.4 auch standardmäßig verwendet werden kann. JAXP kann in Java mit jaxp.xml.parsers.SAXParser eingebunden
werden. Auf diesem JAXP basiert auch der zweite SAX-Parser von Apache
mit der Bezeichnung Crimson
(org.apache.crimson.parser.XmlReaderImpl).
Doch auch GNU war nicht untätig und entwickelte den häufig eingesetzten Aelfred2 (gnu.xml.aelfred2.SAXDriver), der jedoch die Validierung nicht
beherrscht. Letztendlich durfte Microsoft den anderen Großen in nichts
nachstehen und entwickelte ihren eigenen SAX-Parser MSXML 4.0, bei dem
allerdings keine Java-Implementierung verfügbar ist. Oracle als einer der
größten Datenbankentwickler entwickelte XDK für Java
(com.oracle.xml.parser.v2.SAXParser). SAXON dagegen baute mit dem XSLT
Prozessor auf dem Aelfred-Parser auf
(com.icl.saxon.aelfred.SAXDriver) und mit xp existiert einer der schnellsten
SAX-Parser überhaupt7 (com.jclark.xml.sax.Driver).
7
Ein Überblick über alle hier aufgeführten Parser gibt [RG02]
15
5
Zusammenfassung
Zusammenfassend läßt sich sagen, daß sich SAX-Parser hervorragend dazu
eignen, schnell XML-Dokumente zu durchsuchen und Informationen ausfindig zu machen. Der größte Vorteil von heutiger Software ist trotz der steigenden Prozessorgeschwindigkeit eben immer noch die Geschwindigkeit. Dadurch das David Megginson die Rechte an die public domain abgegeben hat,
gehört SAX niemandem und doch jedem. Die Gedanken sind frei und so steht
der weiteren Entwicklung der SAX-Schnittstelle nichts im Weg. Jeder kann
daran teilhaben. SAX ist ein Kind des Internets und hat sich ebenso gut
entwickelt.
16
A
Wichtige Internetadressen
• SAX-Projektseite:
http://www.saxproject.org/
• David Brownel’s Top Ten SAX2 Tips:
http://xml.com/pub/a/2001/12/05/sax2.html
• Online Tutorien des World Wide Web Consortium (W3C):
http://www.w3schools.com/
B
Abkürzungen und Akronyme
API
DOM
DTD
GNU
HTML
IBM
JAXP
JDK
SAX
W3C
XML
XSL
XSLT
YAXPAPI
Application Programming Interface
Document Object Model
Document Type Definition
GNU is Not UNIX
Hypertext Markup Language
International Business Machines
Java API for XML Processing
Java Development Kit
Simple API for XML
World Wide Web Consortium
Extensible Markup Language
Extensible Stylesheet Language
XSL Transformations
Yet Another XML Parser API
17
Literatur
[RG02]
T. Rottach, S. Groß: XML kompakt – Die wichtigsten
Standards, Spektrum, Berlin, 2002.
[Sal02]
K.B. Sall: XML Family of Specifications – A practical
guide, Pearson Education, Boston, 2002.
[Bro02]
Verschiedene: Der Brockhaus – Computer und Informationstechnologie, Brockhaus, Mannheim, 2002.
[SAX]
Die offizielle Simple API for XML Homepage
http://www.saxproject.org/
[W3C]
World Wide Web Consortiums W3Schools Online Web
Tutorials
http://www.w3schools.com/
18