Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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

XML mit Access, Teil 3

Tom Jordan, Düsseldorf

Wie Sie XML in Ihrer Access-Datenbank noch konkreter einsetzen können, erfahren Sie in diesem dritten und letzten Beitrag aus unserer XML-Serie. Hier präsentiert Access im Unternehmen Ihnen eine allgemeine Lösung zur Konvertierung einer Access-Tabelle nach XML (und zurück). Wie in den letzten Beiträgen werden dabei ADO und XMLDOM eingesetzt.

Tabellendaten zu XML

Obwohl ein ADO-Recordset die Möglichkeit bietet, Daten nach XML zu exportieren, können Sie das Format der resultierenden XML-Daten nicht beeinflussen. Daher die Frage, wie man selbst die Funktion "nachprogrammieren" könnte. Mit dem XMLDOM ist es durchaus möglich, ein XML-Dokument nach der Struktur eines Recordsets zu erstellen und dieses mit Daten zu füllen.

Daten zusammenstellen

Bei dieser Lösung sollten Sie systematisch vorgehen und sich zuerst überlegen, wie die Daten zum Exportieren ermittelt und aufbereitet werden sollen. Im ersten Teil dieser Serie haben Sie ein Code-Beispiel kennen gelernt, in dem die Tabelle Versandfirmen (aus der Nordwind-Beispieldatenbank) mit der ADO-Bibliothek geöffnet wird.

Diese kleine Testprozedur erweitern Sie nun so, dass sie mit zwei Eingabeparametern namens TableName und ElementName versehen wird. Die Prozedur öffnet ein Recordset-Objekt mit der Tabelle, die im Eingabeparameter TableName übergeben wird, und gibt den Inhalt der Tabelle zunächst im Direktfenster aus (s. Quellcode 1).

Interessant bei dieser neuen Prozedur ExportToXML() ist die Verwendung der Fields-Auflistung, die jedes Recordset-Objekt enthält.

Über diese Auflistung können Sie auf jedes Feld (über das Field-Objekt) der Datensatzgruppe zugreifen, ohne vorher zu wissen, wie die Felder benannt sind. Auf diese Weise wird bei jeder Iteration der While-Schleife jedes einzelne Feld ermittelt und sein Name und Wert ausgegeben. Am Ende der Iteration wird mit der MoveNext-Methode zum nächsten Datensatz gewechselt. Zum Schluss wird das Recordset-Objekt mit der Close-Methode geschlossen.

Das Ergebnis im Textformat

Diese Version der Prozedur gibt das unten stehende Ergebnis aus. Da Sie die Felder bei der Ausgabe eingerückt haben, haben Sie schon einen Eindruck davon, wie die XML-Datei aussehen wird:

Versandfirmen

    Versandfirma

        Firmen-Nr = 1

        Firma = Speedy Express

        Telefon = (503) 555-9831

    Versandfirma

        Firmen-Nr = 2

        Firma = United Package

        Telefon = (503) 555-3199

    Versandfirma

        Firmen-Nr = 3

        Firma = Federal Shipping

        Telefon = (503) 555-9931

Quellcode 1: Inhalt einer Tabelle im Direktfenster ausgeben

Sub ExportToXML(ByVal TableName As String, ByVal ElementName As String)

    Dim rst As ADODB.Recordset

    Dim fld As ADODB.Field

    Set rst = New ADODB.Recordset

    rst.CursorLocation = adUseClient

    rst.Open TableName, CurrentProject.Connection

    Debug.Print TableName

    Do While Not rst.EOF

        Debug.Print vbTab & ElementName

        For Each fld In rst.Fields

            Debug.Print vbTab & vbTab & _

                fld.Name & " = " & fld.Value

        Next 'fld

        rst.MoveNext

    Loop

    rst.Close

End Sub

An der Spitze der Ausgabe steht der Tabellenname Versandfirmen, bei jeder Iteration der Elementname Versandfirma. Beide wurden ja als Eingabeparameter übergeben. Die unter jedem Versandfirma-Element stehenden Felder sind das Ergebnis des Durchlaufs der Fields-Auflistung.

Weiter geht's mit XML

Die nächste Baustufe ist die Implementierung der XML-Komponente, die mit XMLDOM erledigt wird.

Die Export-Prozedur erstellt zunächst ein neues XML-Dokument, fügt diesem neue Knoten hinzu und füllt es anschließend mit den Tabellendaten aus dem Recordset.

Das Erstellen des Dokuments sowie seine obersten Elemente (Tabellenname) können Sie mit gerade mal zwei Zeilen Code erledigen:

Set doc = New MSXML2.DOMDocument

Set root = _
     doc.appendChild _
    (doc.createElement(TableName))

Wie Sie der zweiten Zeile entnehmen können, können Sie mit dem XMLDOM Elemente erzeugen (mit createElement) und anderen Elementen hinzufügen (mit appendChild), sodass ein komplettes Dokument aus dem Nichts entsteht.

Auf ähnliche Weise fügen Sie bei jedem Datensatz neue Knoten zu, die mit ElementName benannt werden.

Unter jedem dieser Elemente befinden sich die drei Tabellenfelder samt Werten aus Versandfirma. Nach dem Schließen des Recordsets wird das fertige XML-Dokument ins Filesystem geschrieben. Der Dateiname wird aus dem Tabellennamen und der Erweiterung xml zusammengesetzt (s. Quellcode 2).

Die Ergebnisdatei besteht nun aus reiner XML und kann gegebenenfalls von anderen Systemen eingelesen und analysiert werden. Die Prozedur ExportToXML können Sie einfach wie folgt aufrufen:

Quellcode 2: Schreiben einer Tabelle in ein XML-Dokument

Sub ExportToXML(ByVal TableName As String, ByVal ElementName As String)

    Dim rst As ADODB.Recordset

    Dim fld As ADODB.Field

    Dim doc As MSXML2.DOMDocument

    Dim root As MSXML2.IXMLDOMElement

    Dim element As MSXML2.IXMLDOMElement

    Dim feldElement As MSXML2.IXMLDOMElement

    Set rst = New ADODB.Recordset

    rst.CursorLocation = adUseClient

    rst.Open TableName, CurrentProject.Connection

    Set doc = New MSXML2.DOMDocument

    Set root = doc.appendChild(doc.createElement(TableName))

    Do While Not rst.EOF

        Set element = root.appendChild(doc.createElement(ElementName))

        For Each fld In rst.Fields

            Set feldElement = element.appendChild(doc.createElement(fld.Name))

            feldElement.Text = fld.Value

        Next 'fld

        rst.MoveNext

    Loop

    rst.Close

    doc.Save "C:\Temp\" & TableName & ".xml"

End Sub

ExportToXML "Versandfirmen", 
"Versandfirma"

Das Gegenstück zu ExportToXML, also eine Prozedur, die diese Datei wieder öffnet und die Daten in die ursprüngliche Tabelle einspielt, stellt der folgende Abschnitt vor.

XML zu Tabellendaten

Wie man eine XML-Datei öffnet und die Elemente untersucht, haben Sie bereits im zweiten Beitrag erfahren.

Nun geht es darum, diese Technik mit ADO zu kombinieren, sodass Sie einen Recordset (in diesem Fall also die ursprüngliche Tabelle) mit XML-Daten füllen können. Als Ansatzpunkt sehen Sie sich die XML-Ergebnisdatei an, die aus der vorherigen Prozedur ExportToXML() entstanden ist:

<Versandfirmen>

   <Versandfirma>

      <Firmen-Nr>1</Firmen-Nr>

      <Firma>Speedy Express</Firma>

      <Telefon>(503) 555-9831</Telefon>

   </Versandfirma>

   <Versandfirma>

      <Firmen-Nr>2</Firmen-Nr>

      <Firma>United Package</Firma>

      <Telefon>(503) 555-3199</Telefon>

   </Versandfirma>

   <Versandfirma>

      <Firmen-Nr>3</Firmen-Nr>

      <Firma>Federal Shipping</Firma>

      <Telefon>(503) 555-9931</Telefon>

   </Versandfirma>

</Versandfirmen>

Tabelleninformation direkt aus der XML-Tabelle ermitteln

Da alle Informationen zur Tabelle, inklusive Tabellenname, Feldnamen und Daten, vorhanden sind, können Sie diese XML-Datei einlesen und die Tabelle mit ganz normalen ADO-Methoden wiederherstellen.

Der Name der ursprünglichen Tabelle steht im allerersten Element <Versandfirmen> des Dokuments, wenn Sie die Funktion ExportToXML() zum Exportieren der Daten benutzt haben.

Es wäre also überflüssig, diese Information vom Anwender zu verlangen.

Auch die Feldnamen beim Exportieren sind in die Elementnamen übernommen worden, sodass Sie die Daten den Ursprungsfeldern eindeutig zuordnen können.

Quellcode 3: Import von Daten aus einer XML-Datei per ADO und XMLDOM

Sub ImportFromXML(ByVal Dateiname As String)

    Dim rst As ADODB.Recordset

    Dim doc As MSXML2.DOMDocument

    Dim root As MSXML2.IXMLDOMElement

    Dim tableName As String

    Dim element As MSXML2.IXMLDOMElement

    Dim feldElement As MSXML2.IXMLDOMElement

    ' XML-Datei öffnen

    Set doc = New MSXML2.DOMDocument

    doc.Load Dateiname

    ' Ursprungstabelle aus XML ermitteln

    tableName = doc.documentElement.nodeName

    ' Ursprungstabelle so öffnen, dass 

    ' Datensätze angelegt werden können

    Set rst = New ADODB.Recordset

    rst.CursorLocation = adUseClient

    rst.Open tableName, CurrentProject.Connection, 
        adOpenDynamic, adLockOptimistic

    For Each element In doc.documentElement.childNodes

        rst.AddNew

        For Each feldElement In element.childNodes

            rst.Fields(feldElement.nodeName) = feldElement.Text

        Next 'feldElement

        rst.Update

    Next 'element

End Sub

Die Import-Prozedur

Die neue Prozedur ImportFromXML zum Importieren von XML-Daten sieht folgendermaßen aus:

Das Öffnen des Recordsets mit der Open-Methode sieht diesmal ein wenig anders aus, da dieses für den schreibenden Zugriff geöffnet werden muss. Daher verwenden Sie die Parameter adOpenDynamic und adLockOptimistic.

Außerdem durchläuft die Routine die Feld-Knoten über die allgemeine childNodes-Auflistung, da Sie nicht im Voraus wissen, wie die Felder heißen. Insofern wäre selectNodes beziehungsweise selectSingleNode mit einem XPath-Ausdruck unpraktisch.

Die Prozedur ImportFromXML lässt sich genauso einfach bedienen wie ExportToXML:

ImportFromXML "C:\Temp\Versandfirmen.xml"

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.