XML-Dokumente mit VBA erstellen und lesen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Schaut man sich in Foren und im Web um, so scheint XML im Zusammenhang mit Access und VBA mehr Fragen aufzuwerfen als zu beantworten. In den meisten Fällen dreht es sich um das Problem, wie man per VBA ein XML-Dokument mit bestimmten Elementen und Attributen erzeugt. Die Grundlagen dazu liefert dieser Beitrag genauso wie die zum Auslesen der erzeugten XML-Dokumente.

Meist ist es doch so: Jemand fordert den Export von Daten in einem bestimmten XML-Format an oder liefert dieses Format, das Sie dann flugs in die passenden Tabellen der Datenbank importieren sollen. Beides ist prinzipiell einfach, aber da das Internet bislang kaum Informationen zu diesem stark gefragten Thema liefert, muss man erst einmal herausfinden, wie die einzelnen Techniken ineinandergreifen.

Dass dieses Thema tatsächlich gefragt ist, zeigt die Zugriffsstatistik der Know-how-Beiträge von www.access-im-unternehmen.de: Hier liegen die vier Artikel zum Thema XML meistenteils unter den Top Ten der am meisten abgerufenen Seiten.

XML-Dokument als Zeichenkette

Die einfachste Variante, um ein XML-Dokument zu erstellen, sind die herkömmlichen Text-Funktionen von VBA. Ein Beispiel liefern die folgenden Zeilen. Sie erstellen ein XML-Dokument, wie es in Bild 1 abgebildet ist:

abb001.tif

Bild 1: Ein einfaches XML-Dokument

Dim str As String
str = "<xml version='1.0' encoding='iso-8859-1'>" & vbCrLf
str = str & "<Rootelement>"
str = str & "<Element>"
str = str & "Text des Elements"
str = str & "</Element"
str = str & "</Rootelement>"
Open "c:\text.xml" For Output As #1
Print #1, str
Close #1

Dabei stellen Sie die einzelnen Elemente des Dokuments Stück für Stück zu einer Zeichenkette zusammen und speichern diese anschließend in einer Datei. Wer in der Lage ist, mit DAO oder ADO eines oder mehrere verschachtelte Recordsets zu durchlaufen, braucht nur noch die passenden Anweisungen zum Zusammensetzen der Zeichenkette aus den gewünschten Feldinhalten darin unterzubringen.

XML-DOM

Selbstverständlich ist das der am wenigsten elegante Weg und er ist zudem fehleranfällig. Besser funktioniert es, wenn Sie die für solche Zwecke vorgesehene XML-Bibliothek von Microsoft verwenden, die beispielsweise den Zugriff auf die einzelnen Elemente eines XML-Dokuments bietet – und zwar über das Document Object Model (DOM). Um dieses einzusetzen, brauchen Sie einen Verweis auf die Bibliothek Microsoft XML, vx.y. Sie werden eine ganze Reihe von Versionen dieser Bibliothek in der Liste vorfinden, von denen die älteste (v2.6) für die nachfolgenden Beispiele ausreicht. Jedes XML-Dokument enthält eine Zeile, die das Dokument als XML-Dokument charakterisiert und weitere Informationen, wie etwa die Version oder Hinweise zur Kodierung der enthaltenen Zeichen, liefert. Diese Zeile sieht meist zumindest so aus:

<xml version="1.0">

Enthalten die Elemente Umlaute oder sonstige Sonderzeichen, empfiehlt sich die Angabe einer passenden Kodierung. Folgendes kleine Dokument würde beispielsweise im Internet Explorer einen Fehler auslösen:

<xml version='1.0'>
<root>äöü</root>

Durch Hinzufügen eines weiteren Attributs zur ersten Zeile beheben Sie den Fehler:

<xml version="1.0" encoding="iso-8859-1" > 
<Root>äöü</Root>

Die Kodierung iso-8859-1 sorgt dafür, dass Sie Umlaute sowie andere Sonderzeichen im Dokument verwenden können, ohne dass Sie diese kodieren müssen – dann müssten Sie nämlich beispielsweise &#228; für den Buchstaben ä schreiben.

XML erzeugen „by example“

Genug der Vorrede: Im Folgenden finden Sie Beispiele für verschiedene XML-Dokumente (jeweils im Kasten) und die passenden VBA-Anweisungen.

Beispiel: Einfaches XML-Dokument mit
Root-Element

<xml version="1.0" encoding="iso-8859-1" >

<root />

Dies ist fast das einfachste XML-Dokument, das Sie erzeugen können – es beinhaltet lediglich ein Element namens root (XML-Dokumente ohne ein einziges Element sind nicht gültig). Sie erzeugen es beispielsweise mit den folgenden Anweisungen:

Dim objXML As DOMDocument
Set objXML = New DOMDocument
objXML.loadXML "<xml version='1.0'
encoding='iso-8859-1'><Rootelement/>" 'objXML.Save "c:\text.xml"

Das Problem hierbei ist, dass Sie den Inhalt der ersten Zeile von Hand zusammenschreiben müssen, was zu Fehlern führen könnte – beispielsweise, weil die Attribute nicht in der vorgeschriebenen Reihenfolge vorliegen.

Besser macht es die folgende, aber längere Variante, die das gleiche Ergebnis liefert:

Dim objXML As DOMDocument
Dim objRoot As IXMLDOMElement
Dim objPI As IXMLDOMProcessingInstruction
Set objXML = New DOMDocument
Set objPI = _
objXML.createProcessingInstruction("xml", _
"version='1.0' encoding='iso-8859-1'") Set objRoot = objXML.createElement("root") objXML.appendChild objPI objXML.appendChild objRoot objXML.Save "c:\text.xml"

Das sieht schon recht kompliziert aus, daher eine kurze Erläuterung: objXML erhält zunächst ein neues, leeres XML-Dokument, noch ohne physische Entsprechung in Form einer Datei auf der Festplatte. Die Processing Instruction objPI, die zum Angeben von Verarbeitungsinformationen wird dann mithilfe der Methode createProcessingInstruction zusammengesetzt.

Das Root-Element hat den Typ IXMLDOMElement – genau wie alle anderen Elemente, die Sie in den weiteren Beispielen hinzufügen werden. Beide Elemente, objPI und objRoot, fügen Sie dem XML-Dokument objXML in genau dieser Reihenfolge mit der appendChild-Methode hinzu.

Zusammen mit der Hilfsfunktion AddFormat aus dem Kasten Prolog schreiben brauchen Sie nur noch die folgenden Zeilen:

Public Sub XMLMitKodierungUndRootelement_III()
    Dim objXML As DOMDocument
    Dim objRoot As IXMLDOMElement
    Set objXML = New DOMDocument
    AddFormat objXML, eEncodingISO8859_1
    Set objRoot = objXML.createElement("root")
    objXML.appendChild objRoot
    Debug.Print objXML.xml
    objXML.Save "c:\text.xml"
End Sub

Prolog schreiben

Der Prolog eines XML-Dokuments enthält eine erste Zeile, die eine XML-Datei als solche kennzeichnet und weitere Informationen wie die Kodierung und die Version liefert. Zusätzlich kann der Prolog weitere Informationen enthalten, die hier aber zunächst außer Acht bleiben sollen. Die folgende Funktion fügt dem übergebenen, zu diesem Zeitpunkt noch leeren XML-Dokument die besagte erste Zeile hinzu. Die Kodierung kann per Parameter übergeben werden, der Standardwert ist ISO-8859-1.

Public Function AddFormat(objXML As DOMDocument, intEncoding As eEncoding)

Dim objPI As IXMLDOMProcessingInstruction

Dim strEncoding As String

Select Case intEncoding

Case eEncodingUTF8

strEncoding = "utf-8"

Case eEncodingUTF16

strEncoding = "utf-16"

Case eEncodingISO8859_1

strEncoding = "iso-8859-1"

End Select

Set objPI = objXML.createProcessingInstruction("xml", "version='1.0' encoding='" _
& strEncoding & "'")

objXML.appendChild objPI

End Function

Die folgende Enumeration liefert die Elemente für die in der Routine verwendete Variable des Typs eEncoding für UTF-8, UTF-16 und ISO-8859-1:

Public Enum eEncoding

eEncodingUTF8 = 1

eEncodingUTF16 = 2

eEncodingISO8859_1 = 3

End Enum

Im übrigen dürfen Sie sich nicht durch die Ausgabe im Direktfenster irritieren lassen, die die Kodierung vermissen lässt – in der gespeicherten Version ist diese vorhanden.

Beispiel: Einfaches XML-Dokument mit
Root-Element und einem Unterelement

<xml version="1.0" encoding="iso-8859-1" >

<root>

<element />

</root>

Wenn Sie unterhalb des Root-Elements ein weiteres Element einfügen möchten – hier mit dem Namen element -, brauchen Sie zwei Schritte:

  • Erzeugen des neuen Elements mit der createElement-Methode und
  • Anhängen des Elements an das gewünschte übergeordnete Element, hier root.

Dieser Auszug aus der Routine XMLMitUnterelement zeigt, wie es funktioniert – die relevanten Zeilen sind fett gedruckt:

...
Dim objElement As IXMLDOMElement
Set objXML = New DOMDocument
AddFormat objXML, eEncodingISO8859_1
Set objRoot = objXML.createElement("root")
Set objElement = objXML.createElement("element")
objRoot.appendChild objElement
objXML.appendChild objRoot
...

Ob Sie objRoot oder objElement zuerst erzeugen, spielt ebensowenig eine Rolle, wie die Reihenfolge des Anhängens an das jeweils übergeordnete Element.

Beispiel: Unterelement mit Wert

<xml version="1.0" encoding="iso-8859-1" >

<root>

<element>Inhalt</element>

</root>

Das Füllen des Elements mit dem Wert Inhalt erfolgt ganz einfach über die Zuweisung der Zeichenkette an die Text-Eigenschaft der Element-Variablen (Ausschnitt aus XMLUnterelementMitInhalt):

...
Set objElement = objXML.createElement("Element")
objElement.Text = "Wert"
objRoot.appendChild objElement
objXML.appendChild objRoot
...

Beispiel: Unterelement mit Wert und
Attribut

<xml version="1.0" encoding="iso-8859-1" >

<root>

<element id="1">Inhalt</element>

</root>

Ein Attribut fügen Sie einem Element mit der Methode setAttribute hinzu, das gleichzeitig den Namen des Attributs sowie seinen Wert als Parameter erwartet (siehe Prozedur XMLInhaltUndAttribut):

...
Set objElement = objXML.createElement("Element")
objElement.Text = "Wert"
objElement.setAttribute "id", 1
objRoot.appendChild objElement
...

Wofür sollten Sie Attribute überhaupt verwenden Die Daten einer Datenbank etwa ließen sich auch ohne Attribute hierarchisch speichern. Manchmal aber gibt es vielleicht Zusatzinformationen: Wenn Sie beispielsweise Währungswerte haben, möchten Sie vielleicht zusätzlich die Währung abspeichern – da hierfür aber auch in Datenbanktabellen in der Regel kein eigenes Feld vorgesehen ist, schreiben Sie diese Informationen wie folgt in das Attribut:

<stundensatz waehrung="Euro">80</stundensatz>

Beispiel: Weitere Verschachtelungen

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar