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