Schön langsam sind die Zeiten vorbei, in denen man einfach Dokumente validieren konnte. Denkt man...Heute führen viele Wege nach Rom bzw. zur Validierung. In diesem Artikel stelle ich mal 3 Varianten vor:
- Validierung per DOM - XML Schema
- Validierung per DOM - DTD
- Validierung SAX - XML Schema
Validierung DOM - DTD
Zunächst mal die einfachste: Im XML Dokument wird auf eine DTD inline verwiesen.
<?xml version="1.0"?> <!DOCTYPE catalog SYSTEM "cdcatalog.dtd"> <catalog> |
Diese Überprüfung fällt leicht. Bereits beim Laden des XML Dokuments wird die Wohlgeformtheit überprüft und durch die Angabe von
veranlasst man den Parser, gegen das im Kopf des XML Dokuments angegebene DTD (oder auch Schema) zu prüfen.
Dim xmldoc As New DOMDocument
xmldoc.validateOnParse = True xmldoc.async = False xmldoc.Load "cdcatalog_dtd.xml" If xmldoc.parseError.errorCode <> 0 Then GoTo errhandler |
Validierung DOM - XML Schema
Mit der Final Version des Parseres ist es nun auch leichter geworden XML Dokumente gegen ein Schema validieren zu lassen. Dazu ist es notwendig einen sog. Schemacache zu erstellen, dem wir unser XML Schema Dokument hinzufügen. Hier gilt es aufzupasssen. Das Hinzufügen funktioniert nur als File. Die Übergabe eines String oder Variant, in dem dass Schema enthalten ist, reicht hier nicht aus.
' Zunächst wird ein Schema Cache erstellt 'und book.xsd als Schema File angegeben Dim xmlschema As New MSXML2.XMLSchemaCache40 xmlschema.Add "urn:cdcatalog", App.Path & "/schema2.xsd"
'Hier wird ein DomDocument erzeugt Dim xmldom As New MSXML2.DOMDocument40
'Zuweisen des Schemas zum DomDocument Set xmldom.schemas = xmlschema
'Laden des XML Dokuments
xmldom.async = False xmldom.Load App.Path & "/cdcatalog.xml" |
Validierung SAX - XML Schema
Nun kommen wir zum aufwendigsten Teil. Auch mit der Simple API for XML ist nun auch möglich gegen ein Schema Validieren zu lassen. Dazu muß man sich allerdings nochmals daran erinnern, daß die Funktionalität von SAX eventgesteuert ist und der Vorteil bei sehr großen Dokumenten liegt. Das heißt, daß das XML Dokument Stück für Stück gescannt wird und dadurch bestimmte Ereignisse ausgelöst werden können. (start-Element, end-Element etc. (s Art: Sax Artikel).
Für diese Möglichkeit der Validierung gilt es Vorarbeit zu leisten:
Wir erstellen zunächst eine neues Klassenmodul myvalidator in der wir unsere "SAX-handler" unterbringen.
Implements IVBSAXContentHandler Implements IVBSAXErrorHandler Implements IVBSAXLocator Implements IMXSchemaDeclHandler |
Nacheinander rufen wir zu allen SAX Handler die einezelene Eigenschaften auf, sodaß die Ereignisse erstellt werden. Außerdem vergeben wir noch eine Variable als IVBSAXLocator., der als Schnittstelle für die Ereignisse der Handler dient und uns für das aktuelle event column number, line number, public ID, oder system ID ausgeben kann.
Private oLocator As IVBSAXLocator |
Zu Schluß brauchen wir natürlich noch eine gute Fehlerbehandlung, der wir aus den Error Events unsere Parameter übergeben:
Aufruf der Fehlerfunktion:
WriteErrorToResults "Ignorable warning", strErrorMessage, _ nErrorCode, oLocator.lineNumber, oLocator.columnNumber |
Fehlerbehandlung:
Private Function WriteErrorToResults(strLabel As String, _ strDescription As String, ByVal ErrCode As Long, _ Line As Long, Column As Long) frmValid.Text1.Text = _ strLabel + ": (" + CStr(ErrCode) + ") " + _ strDescription & "at " + "line " + _ Str(Line) + ", column " + _ Str(Column) + vbCrLf End Function |
Das gesamte Projdekt gibts auch als download.
Viel Spaß damit!