DevTrain

Autor: Andreas Rauch

We proudly presents SAX2

Die Simple API for XML (SAX2) stellt für Entwickler eine komfortble Alternative zu DOM dar. Aber warum. SAx hat einige kleine Vorteile, die einem dsa Leben mit dem MSXML Pasrer erleichtern. Denken Sie mal an folgendes Szenario. Sie haben ein XML Dokument in der Größe um 1 MB. Laden Sie dieses XML File mit dem DOM - der ja das gesamte XML Dokument in den Speicher lädt - so stellen Sie fest, daß der Speicherbedarf um dsa 10 - 12 -fache anschwillt.  Testen Sie das ruhig einmal. Mit SAX ist der Speicherbedarf signifikant kleiner.

Warum ist das so? SAX lädt Element für Element. Sofern Sie also ein bestimmtes Element oder Attribut suchen, können Sie via SAX das Parsen abrechen. Und das begründet auch schon einen Vorteil von SAX gegenüber DOM. SAX ist eventgesteuert!

Events lassen sich wie folgt kategorisieren:

Events, die im XML document vorkommen. Stichwort CONTENT
Events, die im DTD vorkommen.
Events, die als Fehler auftreten.


Die Reihenfolge der events könnte folgendermaßen aussehen:

Das XML File:

<?xml version="1.0"?>
<root>
<temperatur>26</temperatur>
</root>

nun folgenden Events:

Die Ereignisse werden in Dokumentenreihenfolge gemeldet:
documentLocator, gefolgt von startDocument, startElement, characters, endElement, und endDocument.

StartDocument( )
StartElement( "root" )
StartElement( "temperatur" )
Characters( "26" )
EndElement( "tempeatur" )
EndElement( "root" )
EndDocument( )


SAX hat natürlich auch gravierende Nachteile. Außer, dadurch daß Element für Element geparst wird und ein random Zugriff nicht möglich ist, wird SAX nicht vom Internet Eplorer unterstützt.

Die Frage stellt sich nun auch für andere Bereiche. Unterstützt SAX die Validierung. Bisher noch nicht. Es ist aber abzuwarten, daß in kommenden Versionen ein Platz für Validierung gefunden wird.

Wie wird nun beispielsweise SAX in VB programmiert?

(Das gesamte Beipsiel können Sie als Zip Datei runterladen)


Wichtig setzten Sie zu Beginn des VB Projekts den Verweis auf den aktuellen Parser
Version 3.0 oder höher (aktuell MSXML 3.0 SP1; MSXML 4.0 beta)

3 Dinge bracht der Entwickler: 2 Klassenmodule und ein Formular.

Das erste Klassenmodul das wir erstellen nennen wir Contenthandler. Gleich zu Beginn definieren wir eine Schnittstelle zum IVBSAXContentHandler mit Implements. Damit können wir die logische Struktur des XML Files auslesen.


Danach erstellen wir das Klassenmodul ErrorHandler. Damit implementieren wir den IVBSAXErrorHandler. Hier werden die Methoden zugrundegelegt, falls Fehler auftreten.

In unserem Formular gibt es lediglich 2 Textboxen und 2 Commandbuttons. In der ersten Textbox wird die Datei (und evtl. Pfad) für die XML Datei eingegeben. In der zweiten Textbox wird das Resultat ausgegeben. Fehler oder Erfolgsergebnis.
Der Commandbutton startet den Vorgang. Commandbutton2 beendet das Projekt.

Wir beginnen in Form1 den SAXXMLReader, Content und Errorhandler zu instanzieren.

Dim reader As New SAXXMLReader    'Liest das Dokument
Dim contentHandler As New ContentHandlerImpl 'Rückmeldung der Parserevents
Dim errorHandler As New ErrorHandlerImpl        'Rückmeldung der Fehlerevents

Set reader.contentHandler = contentHandler    
Set reader.errorHandler = errorHandler       

Jetzt kümmern wir uns um die KLassenmodule.
Im Contenthandler Implementieren wir den IVBSAXContentHandler.

Implements IVBSAXContentHandler

Nun stehen uns im Modul die oben beschreibenen Ereignisse zur Verfügung. Im Dokument treffen wir auf Elemente, daher beginnen wir auch in unsere Anwendung mit der Funktion IVBSAXContentHandler_startElement. Das bedeutet: Sobald beim Parsen auf ein Element gestossen wird, wird auch das Ereignis startElement erzeugt. Hier beginnen wir auch unsere Ausgabe für die Textbox2 zusammenzubauen.


In einer Schleife, die durch attributes.getlength bestimmt wird, der Anzahl der Attribute, lassen wir uns den Namen des Attributs ausgeben und den Wert.

...
attributes.getLocalName(i) & "=""" & _
attributes.getValue(i)
...

     

Nun läuft unsere Anwendung Stück für Stück von einem Ereignis zu anderen.

Im Errorhandler lasse ich Ihnen ein wenig Kreativität übrig. Hier
ist nur der fatalError (nicht abfangbarer Fehler) mit einer Ausgabe der Fehlermeldung behandelt.


Befassen Sie sich mal intensiv mit SAX. Sie werden sehen, daß es einige Vorteile bietet. Es gilt jedoch Vor und Nachteile abzuwägen. Einer Vermengung von DOM und SAX steht prinzipiell nichts entgegen.

Viel Spaß!


Erfasst am: 13.05.2001 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=449
© Copyright 2003 ppedv AG - http://www.ppedv.de