Mit Klick auf die Schaltfläche soll die Datei
Test.xml
geladen werden:
Private Sub Befehl0_Click()
Set xmlDoc = New DOMDocument30
xmlDoc.Load CurrentProject.Path + ("\Test.xml")
End Sub
Die Deklaration der beiden Ereignisprozeduren:
Private Sub xmlDoc_OnDataAvailable()
Liste1.AddItem ("OnDataAvailable")
End Sub
Private Sub xmlDoc_OnReadyStateChange()
Select Case xmlDoc.readyState
Case 1
Liste1.AddItem ("OnReadyStateChange : Loading")
Case 2
Liste1.AddItem ("OnReadyStateChange : Loaded")
Case 3
Liste1.AddItem ("OnReadyStateChange : Interactive")
Case 4
Liste1.AddItem ("OnReadyStateChange : Completed")
MsgBox "Fertig!"
End Select
End Sub
Test
Starten Sie das Programm und kontrollieren Sie den Ablauf.
Abbildung 12.61 Laufzeitansicht
Bemerkung
Sollten Sie die Eigenschaft Async des DOMDocument-Objekts auf False setzen, werden zwar alle OnReady-
StateChange-Ereignisse ausgelöst, nicht jedoch OnDataAvailable!
XML-Daten in einer TreeView darstellen
XML; TreeView-Control; WithEvents-Deklaration;
Mit einem kleinen Beispielprogramm möchten wir Ihnen zeigen, wie Sie XML-Daten strukturiert in einer
TreeView-Komponente anzeigen können. Das Programm lässt sich schnell und einfach an Ihre eigenen
Erfordernisse anpassen, beispielsweise um den Unterschied zwischen den verschiedenen Knotentypen dar-
zustellen.
813
Praxisbeispiele
Kapitel 12: XML in Theorie und Praxis
Oberfläche
Erstellen Sie ein neues Formular und fügen Sie über die Multifunktionsleiste (ActiveX-Steuerelement ein-
fügen) ein Microsoft TreeView-Control in das Formular ein. Ein Bezeichnungsfeld dient der Ausgabe (Anzahl
der geladenen Knoten), über eine Befehlsschaltfläche werden die Daten geladen.
Programmierung
Binden Sie zunächst die Library Microsoft XML, v6.0, über den Menübefehl Extras/Verweise... ein. Da wir
auch auf die Ereignisse des DOMDocument-Objektes zugreifen wollen, müssen wir die Option WithEvents
bei der Deklaration der Objektvariablen angeben:
Dim WithEvents xmlDoc As DOMDocument30
Mit dem Klick auf die Schaltfläche werden eine Instanz des
DOMDocument
-Objektes erzeugt und die Datei
Test.xml
geladen:
Private Sub Befehl0_Click()
Set xmlDoc = New DOMDocument30
TreeView5.Nodes.Clear
xmlDoc.Load CurrentProject.Path + ("\Test.xml")
End Sub
Gleichzeitig löschen wir die bisherigen Inhalte der
TreeView
-Komponente.
Mit dem Auslösen des
OnDataAvailable
-Ereignisses können wir auch die Anzahl der Knoten bestimmen:
Private Sub xmlDoc_ondataavailable()
Dim node As IXMLDOMNode
Dim anzahl%
Set node = xmlDoc.documentElement
anzahl = xmlDoc.childNodes.length
If (TypeName(node) <> "Nothing") Then anzahl = anzahl + node.childNodes.length
Bezeichnungsfeld8.caption = anzahl & " Knoten geladen"
End Sub
Mit der kompletten Verarbeitung des XML-Dokumentes durch das DOM (
readyState = 4
) können wir uns
dem Einlesen der Baumstruktur zuwenden. Doch bevor es so weit ist, sollten Sie eine Fehlerprüfung durch-
führen, da das Ereignis auch eintritt, wenn die XML-Daten fehlerhaft sind:
Private Sub xmlDoc_onreadystatechange()
Dim parseError As IXMLDOMParseError
If (xmlDoc.readyState = 4) Then ' COMPLETE ...
Set parseError = xmlDoc.parseError
If TypeName(xmlDoc.documentElement) = "Nothing" Then
MsgBox parseError.reason, vbExclamation
Else
Im Erfolgsfall rufen wir die Prozedur
ShowNode
mit den Argumenten »Vorgängerknoten im Bau
(
Nothing
, d.h. keiner) und »Wurzelknoten der XML-Daten« (
xmlDOC
) auf.
ShowNode Nothing, xmlDOC
TreeView1.Nodes.Item(1).Expanded = True
814
HINWEIS
HINWEIS
End If
End If
End Sub
Übergeben Sie statt xmlDOC das Objekt xmlDOC.documentElement, beginnt die Baumansicht direkt mit dem
ersten Knoten der XML-Daten, d.h. »WELT«, andernfalls mit der Datei selbst.
Die Prozedur zur Anzeige in der TreeView:
Public Sub ShowNode(ByRef parent As node, ByRef xmlnode As IXMLDOMNode)
Dim caption As String, i%
Dim TreeNode As node
Wird kein gültiges DOM-Objekt übergeben, wird die Routine beendet:
If xmlnode Is Nothing Then Exit Sub
Die Beschriftung des Baumknotens festlegen:
Caption = ""
If xmlnode.nodeType = NODE_DOCUMENT Then Caption = "XML-Datei"
If xmlnode.nodeType = NODE_ELEMENT Then Caption = xmlnode.nodeName
If xmlnode.nodeType = NODE_CDATA_SECTION Or xmlnode.nodeType = NODE_TEXT Then _
Caption = xmlnode.nodeValue
If Caption = "" Then Exit Sub
Je nach Knotentyp müssen wir andere Eigenschaften zur Bestimmung der Beschriftung auslesen.
Sollte als Parent für den neuen
TreeView
-Knoten
Nothing
übergeben werden, handelt es sich um den Root-
bzw. Wurzelknoten des Baums, andernfalls müssen wir den Index des übergeordneten Elementes bestimmen:
If (parent Is Nothing) Then
Set TreeNode = TreeView1.Nodes.Add(, , , caption)
Else
Set TreeNode = TreeView1.Nodes.Add(parent.Index, tvwChild, , caption)
End If
Sollten Unterelemente vorhanden sein, rufen wir für jedes dieser Elemente die aktuelle Prozedur rekursiv auf:
If Not (xmlnode.childNodes Is Nothing) Then
For i = 0 To xmlnode.childNodes.length - 1
ShowNode TreeNode, xmlnode.childNodes.Item(i)
Next i
End If
End Sub
Test
Starten Sie das Programm und klicken Sie auf die Schaltfläche, um die Daten aus der Datei zu lesen.
815
Praxisbeispiele

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.