Spass mit SAX in VB6

Kombinieren wir nun all diese Komponenten zu einem Beispiel. Ich habe unseren alten Bekannten, den Buchkatalog, so umgeschrieben, dass er anstelle von DOM nun SAX verwendet. Die Anwendung wurde stark vereinfacht, damit man sich besser auf die Funktionsweise von SAX konzentrieren kann: Ich habe die Funktionen ‚New Book‘ und ‚Edit Book‘ entfernt. Der Quellcode für dieses Projekt steht zum Download bereit; er beinhaltet eine Kopie von catalog.xml, dem XML-Buchkatalog, den die Anwendung parst und in einer Baumstruktur darstellt. Abbildung A zeigt die Anwendung bei der Arbeit.


Abbildung A: Die SAX-Musteranwendung bei der Arbeit.

Der erste Schritt bei der Erstellung einer SAX-Client-Anwendung ist die Implementierung des Content-Handler-Interfaces IVBSAXContentHandler. In Listing A befindet sich der Code für cSaxReader, der das Interface sowohl für den Content-Handler als auch für den Error-Handler implementiert.

Betrachten wir zuerst den Content-Handler. Man sieht, dass ich die Methoden startDocument, startElement, characters und endElement implementiert habe. Die Aufgabe der Methode startDocument besteht einfach nur darin, die Collection Class zuzuweisen, die die Bücher im Katalog hält, sobald SAX mit dem Parsen eines neuen Dokuments beginnt. Die eigentliche Arbeit wird durch die Methoden startElement und characters erledigt. Erstere speichert den Namen des aktuellen Elements, strLocalName, in einer Variablen auf Modulebene, damit characters beim späteren Zugriff auf die Daten des Elements diese Daten einer geeigneten Class-Property für das Buch zuweisen kann. Wird ein Element mit dem Namen „book“ an startElement übergeben, findet diese Methode die ID-Nummer des Buchs, indem sie das ID-Attribut aus dem Parameter oAttributes (eine Instanz von IVBSAXAttributes) entnimmt. Wird schließlich endElement aufgerufen, verwirft diese Methode den Namen des aktuellen Elements und setzt eine Boolesche Flagge, die anzeigt, ob das Parsen eines Buchs beendet wurde oder nicht. Damit wird vermieden, dass characters die vom Parser zwischen den Elementen gefundenen Leerräume unnötigerweise verarbeitet.

Wie bereits erwähnt, ist die Implementierung eines Error-Handler-Objekts reichlich redundant, denn fatale Parsing-Fehler werden offensichtlich in jedem Fall als abfangbare Fehler zurück an die Client-Anwendung gegeben. Allerdings ist ein implementierter Error-Handler sehr wohl in der Lage, zu bestimmen, an welcher Stelle im Dokument der Fehler aufgetreten ist. Dies lässt sich bewerkstelligen, indem man die Eigenschaften lineNumber und columnNumber der IVBSAXLocator-Instanz untersucht, die an die Methode fatalError des Handlers übergeben wird. Dies erledige ich in der Methode fatalError von cSaxReader.

Nachdem der Content-Handler und der Error-Handler eingerichtet sind, braucht man den Parser nur noch an die Arbeit zu schicken: indem man die Methode parse oder parseURL von SAXXMLReader aufruft.

Page: 1 2 3

ZDNet.de Redaktion

Recent Posts

Dirty Stream: Microsoft entdeckt neuartige Angriffe auf Android-Apps

Unbefugte können Schadcode einschleusen und ausführen. Auslöser ist eine fehlerhafte Implementierung einer Android-Funktion.

5 Tagen ago

Apple meldet Umsatz- und Gewinnrückgang im zweiten Fiskalquartal

iPhones und iPads belasten das Ergebnis. Außerdem schwächelt Apple im gesamten asiatischen Raum inklusive China…

5 Tagen ago

MadMxShell: Hacker verbreiten neue Backdoor per Malvertising

Die Anzeigen richten sich an IT-Teams und Administratoren. Ziel ist der Zugriff auf IT-Systeme.

6 Tagen ago

April-Patches für Windows legen VPN-Verbindungen lahm

Betroffen sind Windows 10 und Windows 11. Laut Microsoft treten unter Umständen VPN-Verbindungsfehler auf. Eine…

6 Tagen ago

AMD steigert Umsatz und Gewinn im ersten Quartal

Server-CPUs und Server-GPUs legen deutlich zu. Das Gaming-Segment schwächelt indes.

6 Tagen ago

Google stopft schwerwiegende Sicherheitslöcher in Chrome 124

Zwei Use-after-free-Bugs stecken in Picture In Picture und der WebGPU-Implementierung Dawn. Betroffen sind Chrome für…

1 Woche ago