Zusammenfassung
Erzeugen Sie XML-Dateien aus Recordsets und umgekehrt und lernen Sie weitere Features von XML kennen.
Techniken
XML, Recordsets, XMLDOM, XPath
Voraussetzungen
Access 2000 und höher, MSXML 3.0
Beispieldateien
Tom Jordan, Düsseldorf
Im ersten Teil dieser Beitragsreihe haben Sie Grundlagen zu XML kennen gelernt und erfahren, wie Sie eine Tabelle oder das Ergebnis einer Abfrage im XML-Format speichern können. Das Ganze funktioniert natürlich auch per VBA – wie, erfahren Sie im vorliegenden Beitrag. Außerdem lernen Sie weitere Techniken für den Umgang mit XML-Dateien kennen.
Wenn man direkt aus dem Datenbankfenster Tabellen und die Ergebnisse von Abfragen in ein XML-Dokument speichern kann, dann sollte das wohl auch per VBA möglich sein. Genauso interessant ist natürlich die Möglichkeit, Daten aus XML-Dateien wieder in eine Access-Tabelle einzulesen.
Inhalt eines Recordsets im XML-Format abspeichern
Das Speichern von Datensätzen im XML-Format ist besonders dann sinnvoll, wenn Sie die Daten in einem Unicode-Textformat an einen Dritten übertragen möchten. Der Empfänger kann die Daten entweder mit dem eigenen XML-Parser öffnen und analysieren oder die Daten können mit ADO wieder in ein Recordset geschrieben werden. Der folgende Prozedurausschnitt aus Quellcode 1 zeigt das Erzeugen und Abspeichern eines Recordsets in eine XML-Datei.
Quellcode 1: Speichern einer Datensatzgruppe im XML-Format
Public Sub RecordsetZuXML() Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.CursorLocation = adUseClient rst.Open "Versandfirmen", _ CurrentProject.Connection rst.Save "C:\Temp\Versandfirmen.xml", adPersistXML rst.Close End Sub
Bei der Save-Methode des Recordset-Objekts geben Sie einen Dateinamen sowie den Parameter adPersistXML an, um den Recordset als XML abzuspeichern. In diesem Fall erzeugt die Save-Methode die Datei C:\Temp\Versandfirmen.xml mit dem Inhalt aus Quellcode 2.
Beim ersten Blick scheinen in der XML-Datei viele überflüssige Daten enthalten zu sein. Warum das so ist und wie Sie Ihre eigene Struktur definieren können, erfahren Sie gleich im Abschnitt zu XML-Schemas. Zunächst wollen wir prüfen, ob wir die gerade erzeugte XML-Datei wieder einlesen können.
Quellcode 2: Ergebnis des Speicherns eines Recordsets im XML-Format
<xml xmlns:s=''uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'' xmlns:dt=''uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'' xmlns:rs=''urn:schemas-microsoft-com:rowset'' xmlns:z=''#RowsetSchema''> <s:Schema id=''RowsetSchema''> <s:ElementType name=''row'' content=''eltOnly''> <s:AttributeType name=''c0'' rs:name=''Firmen-Nr'' rs:number=''1'' rs:maydefer=''true'' rs:writeunknown=''true''> <s:datatype dt:type=''int'' dt:maxLength=''4'' rs:precision=''10'' rs:fixedlength=''true''/> </s:AttributeType> <s:AttributeType name=''Firma'' rs:number=''2'' rs:nullable=''true'' rs:maydefer=''true'' rs:writeunknown=''true''> <s:datatype dt:type=''string'' dt:maxLength=''40''/> </s:AttributeType> <s:AttributeType name=''Telefon'' rs:number=''3'' rs:nullable=''true'' rs:maydefer=''true'' rs:writeunknown=''true''> <s:datatype dt:type=''string'' dt:maxLength=''24''/> </s:AttributeType> <s:extends type=''rs:rowbase''/> </s:ElementType> </s:Schema> <rs:data> <z:row c0=''1'' Firma=''Speedy Express'' Telefon=''(503) 555-9831''/> <z:row c0=''2'' Firma=''United Package'' Telefon=''(503) 555-3199''/> <z:row c0=''3'' Firma=''Federal Shipping'' Telefon=''(503) 555-9931''/> </rs:data> </xml>
XML-Daten wieder einlesen
Um die XML-Datei wieder zu öffnen und den Inhalt in ein Recordset-Objekt einzulesen, verwenden Sie eine Variante der Open-Methode, die Ihnen speziell zu diesem Zweck zur Verfügung steht (s. Quellcode 3).
Quellcode 3: XML-Datei in ein Recordset einlesen
Public Sub XMLZuRecordset() Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "C:\Temp\Versandfirmen.xml", _ "Provider=MSPersist;", _ adOpenForwardOnly, _ adLockReadOnly, _ adCmdFile rst.Close End Sub
Wenn eine externe Datei aus dem Filesystem eingelesen werden soll, kümmert sich der Provider MSPersist um die Details der Dateioperationen (öffnen, stückweise einlesen, schließen und so weiter). Der letzte Parameter der Open-Methode adCmdFile signalisiert, dass es sich um eine Datei außerhalb der Access-Umgebung handelt.
Die im vorigen Beispiel erzeugte XML-Datei enthält erst am Ende die eigentlichen Tabellendaten, im ersten Teil finden Sie jede Menge Informationen zum Tabellenentwurf. Diese Informationen benötigt ADO, um das Recordset beim Einlesen aus der XML-Datei von Grund auf wieder aufzubauen. Da ein Recordset ja auch Feld- und Datentypinformation enthält, müssen diese Infos auch hinterlegt werden. Die allgemeine Struktur dieser XML-Datei wird von Microsoft festgelegt, wie die erste Zeile zeigt: Hier finden Sie Informationen über das Schema, auf dem das Dokument basiert.