Im Artikel “XML-Dokumente mit VBA lesen” haben wir die grundlegenden Befehle erläutert, mit denen Sie per VBA auf den Inhalt von XML-Dokumenten zugreifen können. Wir sind dort bereits kurz auf die beiden Funktionen SelectNodes und SelectSingleNode eingegangen, mit denen Sie einen Verweis auf eine Auflistung mehrerer Node-Elemente oder eines einzelnen Elements holen können. Dabei geben Sie per Parameter den Pfad zu den gesuchten Node-Elementen oder die Attribute der Elemente auf diesem Pfad an. Im vorliegenden Artikel sehen wir uns im Detail an, wie Sie solche Suchkriterien formulieren können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1905_XML-LesenVBA.accdb.
Beispieldokument
Wir nutzen wieder das Beispieldokument aus dem eingangs erwähnten Artikel, das alle gängigen Eigenschaften und Pfade für Beispiele zum Auffinden von Elementen liefert (siehe Listing 1).
<xml version="1.0"> <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> <Address Type="Shipping"> <Name>Ellen Adams</Name> <Street>123 Maple Street</Street> <City>Mill Valley</City> <State>CA</State> <Zip>10999</Zip> <Country>USA</Country> </Address> <Address Type="Billing"> <Name>Tai Yee</Name> <Street>8 Oak Avenue</Street> <City>Old Town</City> <State>PA</State> <Zip>95819</Zip> <Country>USA</Country> </Address> <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes> <Items> <Item PartNumber="872-AA"> <ProductName>Lawnmower</ProductName> <Quantity>1</Quantity> <USPrice>148.95</USPrice> <Comment>Confirm this is electric</Comment> </Item> <Item PartNumber="926-AA"> <ProductName>Baby Monitor</ProductName> <Quantity>2</Quantity> <USPrice>39.98</USPrice> <ShipDate>1999-05-21</ShipDate> </Item> </Items>
Listing 1: Inhalt eines XML-Dokuments mit einer Bestellung
Voraussetzungen
Wenn Sie die Beispiele dieses Artikels nachvollziehen wollen, verwenden Sie entweder die Beispieldatenbank oder eine eigene Datenbank. Dieser fügen Sie dann einen Verweis auf die Bibliothek Microsoft XML, v6.0 hinzu.
Schnelles Einlesen des XML-Dokuments
Da wir das XML-Dokument aus dem Listing in allen folgenden Beispielprozeduren einlesen müssen, lagern wir die dazu notwendigen Anweisungen in eine eigene Funktion namens DokumentEinlesen aus.
Diese finden Sie in Listing 2. Alle Aufgaben dieser Funktion haben wir bereits im Artikel XML-Dokumente mit VBA lesen erläutert.
<font color=blue>Public Function </font>DokumentEinlesen()<font color=blue> As </font>MSXML2.DOMDocument60
<font color=blue>Dim </font>strDatei<font color=blue> As String</font>
<font color=blue>Dim </font>objXML<font color=blue> As </font>MSXML2.DOMDocument60
strDatei = CurrentProject.Path & "\PurchaseOrder.xml"
<font color=blue>Set</font> objXML = <font color=blue>New</font> MSXML2.DOMDocument60
objXML.Load strDatei
<font color=blue>If </font><font color=blue>Not</font> <font color=blue>Len</font>(objXML.XML) = 0<font color=blue> Then</font>
<font color=blue>Set</font> DokumentEinlesen = objXML
<font color=blue>Else</font>
<font color=blue>MsgBox</font> "Fehler " & objXML.parseError.errorCode & ": " & objXML.parseError.reason
<font color=blue>End If</font>
End Function
Listing 2: Funktion zum Einlesen des Inhalts von XML-Dokumenten
In den folgenden Prozeduren füllen wir einfach eine MSXML2.DOMDocument60-Variable mit dem Ergebnis der Funktion DokumentEinlesen.
XPath
Die Parameter, die wir den beiden Funktionen SelectNodes oder SelectSingleNode übergeben, werden in einer eigenen Sprache formuliert – in XPath.
Wir schauen uns zunächst an, welche Daten uns die beiden Funktionen zurückliefern, wenn wir diesen gar keine Parameter übergeben.
selectSingleNode, einfache Variante
Die Funktion selectSingleNode funktioniert, wie wir schnell herausfinden, schon einmal nicht ohne Parameter. Sie erwartet mindestens die Angabe des Schrägstrichs als Zeichenkette:
Public Sub SelectNodesOhneParameter() Dim objXML As MSXML2.DOMDocument60 Dim objNode As MSXML2.IXMLDOMNode Set objXML = DokumentEinlesen Set objNode = objXML.selectSingleNode("/") Debug.Print objNode.XML End Sub
Wenn wir mit dieser Prozedur auf das mit dem Ausdruck / zu findende Element zugreifen, erhalten wir das vollständige XML-Dokument über die XML-Eigenschaft des gefundenen IXMLDOMNode-Elements.
Aber handelt es sich hierbei überhaupt um ein IXMLDOMNode-Element Das finden wir heraus, wenn wir die Variable objNode als Object deklarieren und den Objekttyp dann mit der Funktion Typename ausgeben lassen:
... Dim objNode As Object 'MSXML2.IXMLDOMNode Set objXML = DokumentEinlesen Set objNode = objXML.selectSingleNode("/") Debug.Print TypeName(objNode) ...
Das Ergebnis lautet:
DOMDocument60
/ liefert also das vollständige Dokument zurück.
selectSingleNode mit Elementname
Wenn wir gezielt den Namen eines Elements angeben, in diesem Fall den des Root-Elements, dann liefert selectSingleNode ein Element des Typs IXMLDOM-Element und gibt den vollständigen Dokumentinhalt mit Ausnahme der Processing Instruction (das ist die
Set objNode = objXML.selectSingleNode("PurchaseOrder") Debug.Print TypeName(objNode) Debug.Print objNode.XML
Anderes Element per Elementname
Wenn wir über den Elementnamen auf ein Element zugreifen wollen, das nicht auf der ersten Ebene liegt, könnten wir das so probieren (die beiden Address-Elemente liegen direkt unterhalb von PurchaseOrder):
Set objNode = objXML.selectSingleNode("Address")
Wenn wir danach mit objNode.XML auf den Inhalt zugreifen wollen, gelingt das nicht – wir erhalten dann die Fehlermeldung aus Bild 1.
Bild 1: Fehler beim Zugriff auf eine nicht gefüllte Objektvariable
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: