Dieser Artikel ist Teil des Magazins 'Access im Unternehmen', Ausgabe .
XML-Export ohne VBA
Für den einen oder anderen Anwendungsfall benötigen Sie die Daten aus den Tabellen Ihrer Datenbank im XML-Format – zum Beispiel, um diese von einer anderen Anwendung aus einzulesen. Access stellt verschiedene Möglichkeiten für den Export von Daten im XML-Format zur Verfügung. Wir schauen uns an, wie dies über die Benutzeroberfläche gelingt und welche Möglichkeiten VBA für diesen Zweck bietet – diesmal ohne Nutzung externer Bibliotheken, also ausschließlich mit Bordmitteln.
XML ist ein wichtiges Austauschformat für Daten. Sehr viele Webservices bieten ihre Daten in diesem Format an oder nehmen diese so entgegen. Daher ist es wichtig zu wissen, welche Möglichkeiten Microsoft Access für den Export der Daten aus den Tabellen der Datenbank zur Verfügung stellt. In diesem Beitrag schauen wir uns daher die in Access eingebauten Möglichkeiten an, also solche, die ohne die Einbindung zusätzlicher Bibliotheken wie etwa Microsoft XML, vX.0 auskommen. Dazu gehören sowohl die entsprechenden Export-Befehle der Benutzeroberfläche als auch einige VBA-Befehle der Access-Bibliothek.
Export per Benutzeroberfläche
Am einfachsten geht es natürlich über die Befehle der Benutzeroberfläche von Access. Wenn Sie im Ribbon zum Tab-Element Externe Daten wechseln, finden Sie dort im rechten Bereich eine Reihe von Befehlen für den Export in die verschiedenen Formate vor. Einer davon lautet XML-Datei (s. Bild 1).
Bild 1: Starten des XML-Exports per Ribbon-BefehlKlicken Sie diesen Befehl beispielsweise an, während Sie die Tabelle tblArtikel (oder eine andere Tabelle) der aktuellen Datenbank im Navigationsbereich markiert haben, erscheint ein Dialog, der einen Dateinamen für die Export-Datei vorschlägt.
Dieser besteht aus dem Eigene Dokumente-Ordner des aktuellen Benutzerverzeichnisses und dem Namen der Tabelle mit der Dateiendung .xml (s. Bild 2). Diesen Pfad können Sie entweder durch direkte Eingabe per Tastatur ändern oder aber über einen Datei speichern-Dialog, den Sie mit einem Klick auf Durchsuchen... öffnen.
Bild 2: Erster Schritt des Export-Assistenten
Im nächsten Schritt erscheint der Dialog aus Bild 3. Hier legen Sie fest, welche Dateien angelegt werden sollen:
Bild 3: Angabe weiterer Informationen- Daten (XML): XML-Datei mit den eigentlichen Daten
- Schema der Daten (XSD): Schema, das zur Prüfung der Validität der im XML-Dokument enthaltenen Daten verwendet wird
- Präsentation Ihrer Daten (XSL): Schema, das zur Umformung der Daten herangezogen werden kann
Um die letzten beiden wollen wir uns in diesem Beitrag nicht kümmern. Aber vielleicht liefert die Schaltfläche Weitere... noch interessante Optionen? Sie öffnet einen weiteren Dialog namens XML exportieren, der wie in Bild 4 aussieht.
Bild 4: Weitere Optionen für den XML-Export
Hier finden Sie für jede der drei in der vorherigen Abbildung möglichen Exportdateien einen Registerreiter mit weiteren Einstellungen. Für uns ist nur die erste Registerkarte interessant, da wir ja keine XSL- oder XSD-Datei exportieren wollen, sondern nur die reine Daten-Datei.
Im TreeView-Steuerelement mit der Überschrift Zu exportierende Daten finden Sie ganz oben die Tabelle, die wir beim Aufrufen des Ribbon-Befehls Externe Daten|Exportieren|XML-Datei markiert hatten. Unterhalb davon finden wir zwei verschiedene Arten von Einträgen:
- Namen von Tabellen, in diesem Fall tblBestelldetails, und
- den Eintrag Daten nachschlagen mit weiteren untergeordneten Tabellennamen, zum Beispiel tblKategorien oder tblLieferanten.
Die unter Daten nachschlagen aufgeführten Tabellen sind solche Tabellen, die von der Haupttabelle tblArtikel aus per Fremdschlüsselfeld referenziert werden, aus der also Werte für den aktuellen Datensatz der Tabelle tblArtikel ausgewählt werden können.
Bei den direkt untergeordneten Tabellen handelt es sich wiederum um Tabellen, die selbst ein Nachschlagefeld zur Auswahl eines Datensatzes der Haupttabelle enthalten. Im Beispiel der Bestellverwaltung handelt es sich dabei um die Tabelle tblBestelldetails, welche über die beiden Fremdschlüsselfelder ArtikelID und BestellungID die Zuordnung von Artikeln zu einer Bestellung vornimmt.
Zu exportierende Datensätze filtern
Neben der Auswahl der einzuschließenden Daten finden Sie rechts einen Bereich namens Zu exportierende Datensätze, der die folgenden drei Optionen bereitstellt:
- Alle Datensätze
- Bestehenden Filter anwenden
- Aktueller Datensatz
Allerdings ist aktuell nur die erste Option aktiviert. Wie aber können wir die anderen beiden Optionen nutzen?
Aktuellen Datensatz exportieren
Die Option Aktueller Datensatz ist relativ einfach verfügbar: Dazu öffnen Sie lediglich zuerst die Tabelle mit den zu exportierenden Daten, in diesem Beispiel tblArtikel, und klicken dann im Ribbon auf den Befehl Externe Daten|Exportieren|XML-Datei. Nach der Angabe der Zieldatei und einem Klick auf die OK-Schaltfläche im Dialog Exportieren - XML-Datei sowie auf die Schaltfläche Weitere... des dann erscheinenden Dialogs XML exportieren taucht der Dialog mit den weiteren Optionen wie in Bild 5 auf.
Bild 5: Export eines einzigen DatensatzesHier finden Sie nun die aktivierte Option Aktueller Datensatz vor, die wir nun auswählen. Der Export eines einzigen Datensatzes einer Tabelle sollte eine überschaubare XML-Datei ergeben, anhand derer wir uns einen ersten Überblick über das Ergebnis verschaffen können. Und wie erwartet sieht das Ergebnis wie folgt recht übersichtlich aus:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-07-02T19:01:14">
<tblArtikel>
<ArtikelID>1</ArtikelID>
<Artikelname>Chai</Artikelname>
<LieferantID>1</LieferantID>
<KategorieID>1</KategorieID>
<Liefereinheit>10 Kartons x 20 Beutel</Liefereinheit>
<Einzelpreis>9</Einzelpreis>
<Lagerbestand>39</Lagerbestand>
<BestellteEinheiten>0</BestellteEinheiten>
<Mindestbestand>10</Mindestbestand>
<Auslaufartikel>0</Auslaufartikel>
</tblArtikel>
</dataroot>
Wir erhalten also neben dem Element dataroot für den aktuellen Datensatz ein Element des Typs tblArtikel, welches für jeden Feldnamen der Tabelle ein untergeordnetes Element enthält, dessen Wert dem Feldwert entspricht.
Gefilterte Datensätze exportieren
Aber vielleicht möchten Sie nicht nur einen bestimmten oder alle Datensätze exportieren, sondern die aktuell per Filter festgelegten Datensätze. Dazu legen wir für die in der Datenblattansicht geöffnete Tabelle einen Filter fest, der zum Beispiel nur die Datensätze liefert, deren Artikelname mit dem Buchstaben A beginnt (s. Bild 6).
Bild 6: Filtern der Datensätze der Tabelle tblArtikelWenn Sie nun den Export in das XML-Format wie in den vorherigen Anläufen starten, erscheinen im Dialog alle Optionen unter Zu exportierende Datensätze aktiviert (s. Bild 7). Sie können nun also auch einen Export durchführen, der nur die mit A beginnenden Artikel enthält.
Bild 7: Ausgabe der Daten mit dem aktuell festgelegten FilterWeitere Daten hinzufügen: Lookupdaten
Nun wollen wir Lookupdaten hinzufügen, im Falle der Tabelle tblArtikel also die Daten der Tabellen tblKategorien und tblLieferanten. Nun wird es interessant, denn wir können dies auf mindestens zwei Arten erledigen: indem wir einfach die entsprechenden Werte wie den Kategorienamen oder den Lieferantennamen anstelle der Werte der Felder KategorieID oder LieferantID exportieren oder indem wir jeweils die kompletten verknüpften Datensätze der beiden Tabellen tblKategorien und tblLieferant zum Datensatz der Tabelle tblArtikel hinzufügen. Für den ersten Fall legen wir einfach eine Abfrage an, welche alle Felder der Tabelle tblArtikel mit Ausnahme von KategorieID und LieferantID enthält, dafür aber die Felder Kategoriename der Tabelle tblKategorien und Firma der Tabelle tblLieferanten. Die Abfrage sieht etwa wie in Bild 8 aus.
Bild 8: Abfrage für den Export der Daten
Um den Export zu starten, verwenden wir nun eine alternative Variante zum entsprechenden Ribbon-Eintrag: Diesmal klicken wir mit der rechten Maustaste auf den entsprechenden Eintrag im Navigationsbereich von Access, nämlich auf qryArtikelMitKategorieUndLieferant, und wählen aus dem Kontextmenü den Befehl Exportieren|XML-Datei aus (s. Bild 9).
Bild 9: Starten des Exports per KontextmenüDas Ergebnis sieht nun etwas anders aus, als wenn wir direkt die Tabelle tblArtikel exportieren. Diesmal erhalten wir statt der Elemente KategorieID und LieferantID mit den Fremdschlüsselwerten die Elemente Kategoriename und Firma mit den entsprechenden Bezeichnungen (s. Listing 1).
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-07-03T12:38:01">
<qryArtikelMitKategorieUndLieferant>
<ArtikelID>1</ArtikelID>
<Artikelname>Chai</Artikelname>
<Firma>Exotic Liquids</Firma>
<Kategoriename>Getränke</Kategoriename>
<Liefereinheit>10 Kartons x 20 Beutel</Liefereinheit>
<Einzelpreis>9</Einzelpreis>
<Lagerbestand>39</Lagerbestand>
<BestellteEinheiten>0</BestellteEinheiten>
<Mindestbestand>10</Mindestbestand>
<Auslaufartikel>0</Auslaufartikel>
</qryArtikelMitKategorieUndLieferant>
...
</dataroot>
Listing 1: Export mit direkter Angabe der Kategorie und der Lieferanten-Firma
Für viele Fälle wird dies reichen, aber wenn Sie die Daten des XML-Dokuments beispielsweise in einer anderen Datenbank wieder einsetzen möchten, welche die gleiche Datenstruktur hat, benötigen Sie unter Umständen die Kategorien und Lieferanten inklusive Fremdschlüssel- und Primärschlüsselwerten.
Daten verknüpfter Tabellen exportieren
Wenn Sie die Daten verknüpfter Tabellen exportieren wollen, gibt es ebenfalls verschiedene Möglichkeiten. Die erste exportiert die Daten in verschachtelter Form, und zwar so, dass in der ersten Ebene etwa die Daten der Tabelle tblKategorien landen und in untergeordneten Elementen jeweils die Datensätze der Tabelle tblArtikel. Hierbei ist zu beachten, dass zu jedem Kategorien-Element immer das komplette zugeordnete Artikel-Element angelegt wird. Diese Variante funktioniert nur, wenn Sie den Export ausgehend von einer Tabelle starten, welche das an der Beziehung beteiligte Primärschlüsselfeld enthält und wenn die untergeordnete Tabelle das Fremdschlüsselfeld beisteuert. Wenn Sie also etwa die Artikel als übergeordnete Elemente und darunter die Kategorien und Lieferanten ausgeben wollen, gelingt dies über den Assistenten nicht. Dies können Sie allerdings per VBA erledigen, wie Sie im Beitrag XML-Export mit VBA (www.access-im-unternehmen.de/1046) erfahren werden.
Die zweite exportiert einfach die Inhalte der betroffenen Tabellen in das XML-Dokument, und zwar so, dass zuerst alle Artikeldatensätze in Form entsprechender Elemente und dann alle Kategorie- und Lieferantendatensätze in die XML-Datei geschrieben werden. Die Beziehung zueinander kann dann über die Fremdschlüsselfelder der Tabelle tblArtikel ermittelt werden, die ja ebenfalls in die Artikel-Elemente übernommen werden.
Diese Variante wird vom Assistenten automatisch gewählt, wenn die Tabelle, für die Sie den Export angestoßen haben, die Fremdschlüsselfelder zur Verknüpfung mit den Werten der Primärschlüsselfelder der verknüpften Tabellen enthält.
Wir schauen uns nun beide Varianten an.
Daten verschachtelt speichern
Bei der ersten Variante markieren wir die Tabelle tblKategorien und starten dann den Export entweder über den entsprechenden Ribbon- oder Kontextmenü-Eintrag. In den erweiterten Optionen wählen wir nun die Tabelle tblKategorien sowie die Tabellen tblArtikel aus (s. Bild 10).
Bild 10: Konfiguration für den Export als verschachtelte ElementeDas Ergebnis sehen Sie in Listing 2. Es gibt zu jedem Datensatz der Tabelle tblKategorien ein Element namens tblKategorien, das die Felder und Feldwerte als Unterelemente enthält – also etwa KategorieID, Kategoriename et cetera. Das Element Abbildung enthält den Binärcode der im Anlagefeld Abbildung gespeicherten Bilddatei. Außerdem gibt es für jeden Eintrag der Tabelle tblArtikel, der mit der jeweiligen Kategorie verknüpft ist, ein Unterelement namens tblArtikel. Diese enthalten jeweils alle Felder der Tabelle tblArtikel samt Feldwert.
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-07-03T13:22:52">
<tblKategorien>
<KategorieID>1</KategorieID>
<Kategoriename>Getränke</Kategoriename>
<Beschreibung>Alkoholfreie Getränke, Kaffee, Tee, Bier</Beschreibung>
<Abbildung>FRwvAAIAAAANAA4AFAAhAP////9CaXRtYXAgSW1hZ2UA...</Abbildung>
<tblArtikel>
<ArtikelID>1</ArtikelID>
<Artikelname>Chai</Artikelname>
<LieferantID>1</LieferantID>
<KategorieID>1</KategorieID>
...
</tblArtikel>
<tblArtikel>
<ArtikelID>2</ArtikelID>
<Artikelname>Chang</Artikelname>
...
</tblArtikel>
...
</tblKategorien>
<tblKategorien>
<KategorieID>2</KategorieID>
<Kategoriename>Gewürze</Kategoriename>
...
</tblKategorien>
...
</dataroot>
Listing 2: Export verschachtelter Daten
Elementnamen anpassen
Für den einen oder anderen Anwendungsfall mag es hinderlich sein, wenn das Artikel-Element beispielsweise tblArtikel heißt:
<tblArtikel>
...
</tblArtikel>
Für einfache Konstellationen mit nur einer einzigen zu exportierenden Tabelle können Sie dies ändern, indem Sie einfach eine Abfrage anlegen, die lediglich die zu exportierende Tabelle mit allen Feldern enthält, und dieser den gleichen Namen geben, unter dem auch die Elemente im XML-Dokument erscheinen sollen – für die Tabelle tblArtikel also etwa mit der Abfrage aus Bild 11. Das Ergebnis sieht nun wie folgt aus – statt tblArtikel heißen die Elemente nun Artikel:
Bild 11: Der Export dieser Tabelle liefert Elemente mit dem Namen Artikel.<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"
generated="2016-07-03T17:24:37">
<Artikel>
<ArtikelID>1</ArtikelID>
<Artikelname>Chai</Artikelname>
<Liefereinheit>10 Kartons x 20 B.</Liefereinheit>
<Einzelpreis>9</Einzelpreis>
<Lagerbestand>39</Lagerbestand>
<BestellteEinheiten>0</BestellteEinheiten>
<Mindestbestand>10</Mindestbestand>
...
</Artikel>
...
</dataroot>
Aber gelingt dies auch, wenn wir mehrere verknüpfte Tabellen exportieren möchten? Probieren wir es mit Kategorien und Artikeln aus. Dazu erstellen Sie auch für die Tabelle tblKategorien eine entsprechende Abfrage, die diesmal schlicht Kategorie heißt. Um das XML-Dokument überschaubar zu halten, lassen wir bei der Definition dieser Abfrage das Feld Abbildung weg (s. Bild 12).
Bild 12: Abfrage für den Export der Daten der Tabelle tblKategorien unter dem Elementnamen KategorieNun wollen wir einen Export starten, der die Datensätze der Abfrage Kategorie enthält und als untergeordnete Elemente die jeweils der aktuellen Kategorie zugeordneten Datensätze der Tabelle tblArtikel – allerdings über die Abfrage Artikel, um auch hier den Elementnamen Artikel statt tblArtikel zu erhalten.
Nach dem Start des Exports der Abfrage Kategorie und der Anzeige der erweiterten Optionen lässt sich die Abfrage Artikel allerdings nicht in der Liste der verknüpften Elemente blicken (s. Bild 13). Hier erscheinen lediglich die Tabellen, die auch für die Exportdatenquelle tblKategorien bereits angezeigt wurden. Der Grund ist schnell gefunden: Der Dialog zeigt nämlich nur die Elemente an, die auch mit dem jeweiligen Objekt beziehungsweise mit dem zugrunde liegenden Objekt verknüpft sind. Der Assistent erkennt also noch, dass tblArtikel mit tblKategorien verknüpft ist und die Abfrage Kategorie auf tblKategorien basiert – also wird tblArtikel auch als zusätzliche Option für die zu exportierende Abfrage Kategorie angezeigt.
Bild 13: tblArtikel statt Artikel: So war das nicht geplant!Dass die Abfrage Artikel auf tblArtikel basiert und wir uns deshalb wünschen, dass diese Abfrage auch in der Liste der verknüpften und exportfähigen Datenquellen auftaucht, akzeptiert Access nicht.
Beziehung zwischen zwei Abfragen herstellen
Aber das ist kein Problem, denn wir können nachhelfen: Dazu brauchen wir lediglich eine weitere Beziehung zwischen diesen beiden Abfragen hinzuzufügen. Dazu öffnen Sie das Beziehungsfenster über den Ribbon-Eintrag Datenbanktools|Beziehungen|Beziehungen und ziehen die beiden Abfragen Artikel und Kategorie hinein.
Nun ziehen Sie das Feld KategorieID der Abfrage Kategorie auf das gleichnamige Feld der Abfrage Artikel, sodass der Dialog Beziehungen bearbeiten erscheint.
Hier stellen Sie fest, dass sowohl unter Tabelle/Abfrage als auch unter Verwandte Tabelle/Abfrage das Feld KategorieID ausgewählt ist, und schließen den Dialog (s. Bild 14).
Bild 14: Herstellen einer Verknüpfung zwischen zwei AbfragenSchließen Sie auch das Beziehungsfenster und bestätigen Sie gegebenenfalls das Speichern der durchgeführten Änderungen.
Wenn Sie nun erneut den Export der Abfrage Kategorie starten und die erweiterten Export-Optionen öffnen, finden Sie die Ansicht aus Bild 15 vor.
Bild 15: Export-Optionen für die neu VerknüpfungAlle verknüpften Tabellen sind verschwunden, stattdessen zeigt das TreeView-Steuerelement unterhalb des Kategorie-Elements das Element Artikel an. Nun exportieren wir die Daten dieser beiden Abfragen und schauen uns die resultierende XML-Datei an.
Das Ergebnis finden Sie in Listing 3. Nun passt es: Die Daten der Tabelle tblKategorien werden unter dem Elementnamen Kategorie abgebildet, die Daten der Tabelle tblArtikel unter Artikel.
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-07-03T17:55:34">
<Kategorie>
<KategorieID>1</KategorieID>
<Kategoriename>Getränke</Kategoriename>
<Beschreibung>Alkoholfreie Getränke, Kaffee, Tee, Bier</Beschreibung>
<Artikel>
<ArtikelID>1</ArtikelID>
<Artikelname>Chai</Artikelname>
...
<KategorieID>1</KategorieID>
</Artikel>
<Artikel>
<ArtikelID>2</ArtikelID>
<Artikelname>Chang</Artikelname>
...
</Artikel>
...
</Kategorie>
...
</dataroot>
Listing 3: Export der Daten der Tabellen tblKategorien und tblArtikel mit den gewünschten Elementnamen
Weitere Änderungen
Es stört allerdings noch die Bezeichnung dataroot für das oberste Element des XML-Dokuments. Hier hätten wir gern das folgende Element:
<Bestellverwaltung ...>
...
</Bestellverwaltung>
Und grundsätzlich wäre es ja schon praktisch, wenn wir nicht erst für jede Tabelle eine Abfrage erstellen müssten, die den Namen des gewünschten Elements enthält, bevor wir die Daten in das XML-Format exportieren.
Vielleicht möchten Sie ja auch noch weitere Änderungen herbeiführen: So wäre es beispielsweise praktisch, das Element KategorieID aus dem Artikel-Element zu entfernen, denn das übergeordnete Kategorie-Element enthält ja schon ein Element mit der KategorieID der zugeordneten Kategorie.
Es gibt aber noch andere Änderungswünsche:
- Die Elemente sollen nicht nach den Tabellen benannt werden (also Kategorie statt tblKategorien, Artikel statt tblArtikel).
- Es sollen nur einige Felder exportiert werden. Aus der Tabelle tblKategorien beispielsweise nur die Felder KategorieID, Kategoriename und Beschreibung, aus der Tabelle tblArtikel nur die Felder ArtikelID, Artikelname und Einzelpreis.
- Die Primärschlüsselwerte aus den Feldern KategorieID und ArtikelID sollen dabei nicht als einzelne Elemente gespeichert werden, sondern als Attribut des jeweiligen Kategorie- beziehungsweise Artikel-Elements – also etwa so:
XML-Dokument transformieren
Solche Änderungen können wir nicht mehr durch Tricks wie etwa das Anlegen von Abfragen erledigen, die nach dem gewünschten Elementnamen benannt werden oder die nur die benötigten Felder enthalten.
Spätestens das Anlegen des Primärschlüsselwertes als Attribut des Elements lässt diese Vorgehensweise scheitern.
Hier kommt eine weitere Option des erweiterten Dialogs für den Export ins Spiel, nämlich der, den Sie über die Schaltfläche Transformieren öffnen. Dieser Dialog sieht wie in Bild 16 aus.
Bild 16: Auswahl der TransformationsdateiHier klicken Sie auf die Schaltfläche Hinzufügen..., wenn Sie bereits eine .xslt-Datei erstellt haben, um das exportierte XML-Dokument zu transformieren. Dies haben wir noch nicht erledigt, also schauen wir uns zunächst an, wie eine solche Datei aussehen könnte.
Für die Beschreibung der Transformation einer XML-Datei gibt es eine eigene Sprache, die ihrerseits einen Aufbau wie eine XML-Datei hat, aber Steueranweisungen und Inhalte vermischt (etwa wie PHP und HTML).
Die .xslt-Datei, die unsere Anforderungen umsetzt, sieht wie in Listing 4 aus. Alle Elemente, die mit xsl: beginnen, enthalten Steueranweisungen, die übrigen Elemente werden direkt übernommen.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">
<xsl:template match="dataroot">
<Bestellverwaltung><xsl:text> </xsl:text>
<xsl:for-each select="tblKategorien">
<Kategorie>
<xsl:attribute name="KategorieID">
<xsl:value-of select="KategorieID"/>
</xsl:attribute>
<xsl:text> </xsl:text>
<Kategoriename>
<xsl:value-of select="Kategoriename"/>
</Kategoriename>
<xsl:text> </xsl:text>
<Beschreibung>
<xsl:value-of select="Beschreibung"/>
</Beschreibung>
<xsl:text> </xsl:text>
<xsl:for-each select="tblArtikel">
<Artikel>
<xsl:attribute name="ArtikelID">
<xsl:value-of select="ArtikelID"/>
</xsl:attribute>
<xsl:text> </xsl:text>
<Artikelname>
<xsl:value-of select="Artikelname"/>
</Artikelname>
<xsl:text> </xsl:text>
</Artikel>
<xsl:text> </xsl:text>
</xsl:for-each>
</Kategorie><xsl:text> </xsl:text>
</xsl:for-each>
</Bestellverwaltung>
</xsl:template>
</xsl:stylesheet>
Listing 4: .xslt-Datei für die Transformierung des exportierten XML-Dokuments
Das bedeutet, dass die Zeile mit der Angabe des Dokumenttyps (<?xml ...) direkt in das Zieldokument übernommen wird. Die zweite Zeile gibt die xsl-Version an. Interessant wird es mit dem Element mit dem Schlüsselwort template. Dieses legt fest, für welches Element die untergeordneten Anweisungen durchgeführt werden sollen.
Das gesuchte Element geben wir mit dem Attribut match="dataroot" an. Dies entspricht dem Root-Element namens dataroot des von Access automatisch erzeugten Exports, wie Sie in den Exportbeispielen weiter oben sehen können.
Wird dieses Element gefunden, soll das öffnende Element
Das erledigen wir mit dem xsl:attribute-Element direkt unterhalb des
Unterhalb dieser Elemente wollen wir nun für jedes Kategorie-Element die verknüpften Artikel aus der Tabelle tblArtikel ausgeben – mit dem Wert des Feldes ArtikelID als Attribut und dem Namen des Artikels in einem Unterelement namens Artikelname.
Dafür nutzen wir wiederum eine for-each-Schleife, die sich diesmal auf die Elemente mit dem Namen tblArtikel beziehen. Dass wir hier tblArtikel und oben tblKategorien als Wert für das Attribut select angegeben haben, ist möglich, weil es sich hierbei um eine relative Angabe handelt. Wir befinden uns vor der Abarbeitung der Schleife über alle tblKategorien-Elemente im Element dataroot, somit können wir mit dem select-Attribut der for-each-Schleife direkt auf tblKategorien als Unterelemente zugreifen. Gleiches gilt für die for-each-Schleife mit select="tblArtikel": Wir befinden uns in der Abarbeitung der tblKategorien-Elemente und können mit select direkt auf die untergeordneten Elemente zugreifen.
So fügen wir nun für jedes Element mit dem Namen tblArtikel ein neues Element namens Artikel zum XML-Dokument hinzu, legen für das Attribut ArtikelID den Wert des entsprechenden Elements des Ausgangsdokuments fest und fügen ein Unterelement namens Artikelname mit dem Artikelnamen als Wert hinzu. Nachdem wir mit
Das Gleiche erledigen wir noch mit dem schließenden Element </Kategorie> und dem Ende der äußeren Schleife (). Schließlich benötigen wir noch ein schließendes </Bestellverwaltung>-Element sowie die beiden Anweisungen und , mit denen die Bearbeitung abgeschlossen wird.
Und ob Sie es glauben oder nicht: Wenn Sie diese paar Zeilen Code unter dem Namen Kategorie.xslt speichern, die Datei als Transformationsdatei beim Export der Tabelle tblKategorien angeben und dort noch die Tabelle tblArtikel hinzufügen, erhalten Sie ein XML-Dokument wie in Listing 5 – also genau wie gewünscht.
<?xml version="1.0" encoding="UTF-16"?>
<Bestellverwaltung xmlns="http://www.w3.org/TR/REC-html40">
<Kategorie KategorieID="1">
<Kategoriename>Getränke</Kategoriename>
<Beschreibung>Alkoholfreie Getränke, Kaffee, Tee, Bier</Beschreibung>
<Artikel ArtikelID="1">
<Artikelname>Chai</Artikelname>
</Artikel>
<Artikel ArtikelID="2">
<Artikelname>Chang</Artikelname>
</Artikel>
<Artikel ArtikelID="24">
<Artikelname>Guaraná Fantástica</Artikelname>
</Artikel>
<Artikel ArtikelID="34">
<Artikelname>Sasquatch Ale</Artikelname>
</Artikel>
...
</Kategorie>
<Kategorie KategorieID="2">
<Kategoriename>Gewürze</Kategoriename>
<Beschreibung>Süße und saure Soßen, Gewürze</Beschreibung>
<Artikel ArtikelID="3">
<Artikelname>Aniseed Syrup</Artikelname>
</Artikel>
<Artikel ArtikelID="15">
<Artikelname>Genen Shouyu</Artikelname>
</Artikel>
...
</Kategorie>
...
</Bestellverwaltung>
Listing 5: Transformiertes XML-Dokument
Kodierung
Mit der Option Codierung können Sie noch einen der Werte UTF-8 oder UTF-16 auswählen.
Alle Daten exportieren
Wenn Sie, ausgehend etwa von der Tabelle tblBestellungen, alle verknüpften Tabellen ausgeben, erhalten Sie eine XML-Ausgabe, die wie folgt aufgebaut ist:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-07-04T14:21:18">
<tblBestellungen>
...
<tblBestelldetails>...</tblBestelldetails>
...
</tblBestellungen>
...
<tblArtikel>...</tblArtikel>
...
<tblKategorien>...</tblKategorien>
...
<tblLieferanten>...</tblLieferanten>
...
<tblVersandfirmen>...</tblVersandfirmen>
...
<tblKunden>...</tblKunden>
...
<tblAnreden>...</tblAnreden>
...
<tblPersonal>...</tblPersonal>
...
</dataroot>
Hier sind also gerade einmal die Einträge der Tabelle tblBestelldetails unterhalb des jeweiligen Elements des Typs tblBestellungen integriert. Den Rest fügt der Assistent einfach nacheinander zum XML-Dokument hinzu. Das ist aber kein Problem: Wenn Sie etwa eine neue, leere Datenbank anlegen und einen XML-Import auf Basis der so exportierten XML-Datei durchführen, werden die Tabellen fast vollständig wieder angelegt.
Lediglich beim Import des Feldes Abbildung der Tabelle tblKategorien taucht ein Fehler auf, weil der Datentyp nicht groß genug für den Inhalt gewählt wird. Der Import in bestehende Tabellen gelingt jedoch ohne Probleme.
Zusammenfassung und Ausblick
Für den Export von Tabellendaten mit dem Ziel, diese in eine Datenbank mit gleichem Aufbau wieder zu importieren, liefert die Benutzeroberfläche von Access ausreichende Möglichkeiten. Durch Anwenden einer .xslt-Datei können Sie die Daten sogar direkt beim Export so transformieren, dass diese auch für andere Ziele in korrekter Form vorliegen.
Die hier vorgestellten Abläufe lassen sich auch per VBA erledigen. Wie dies gelingt, erfahren Sie im Beitrag XML-Export mit VBA (www.access-im-unternehmen.de/1046).