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

Ein XML-Schema ist ein Dokument, das Regeln zu Struktur und Inhalt eines XML-Dokuments definiert. Ein Schema legt etwa die erlaubten Elemente eines XML-Dokuments, die erlaubten Attribute eines Elements, die Anzahl der erlaubten Element-Wiederholungen und die Reihenfolge der Elemente fest.

XML-Schemata liegen selbst im XML-Format vor und dienen dem Festlegen einer festen Datenstruktur bei XML-Dokumenten für den gleichen Einsatzzweck. Beispielsweise könnten alle XML-Dokumente mit Daten zu medizinischen Proben an einer Universität auf einem gemeinsamen Schema basieren. Wenn der Leser ein solches XML-Dokument öffnet und analysiert, welches bereits gegen das Schema geprüft wurde, sind die Datenelemente vorzeitig bekannt. Auf diese Weise kann auf eine aufwändige Fehlerbehandlung beim Lesen verzichtet werden.

Das Recordset-Schema

Das erzeugte XML-Dokument Versandfirmen.xml enthält in den ersten Zeilen einen Verweis auf Schema-Informationen, die dieses Dokument als Recordset identifiziert. Wenn Sie diese Schema-Information vorfinden, können Sie sicher davon ausgehen, dass Elemente wie ElementType, AttributeType, data und row vorhanden sind. Auf diese Elemente können Sie dann explizit zugreifen.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar