XML mit Access, Teil 2

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

XML.mdb

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.

XML-Schema definieren

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar