XML-Export: CDATA

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

In der vorherigen Ausgabe haben wir uns ausführlich mit dem Export von Tabellendaten in XML-Dokumente beschäftigt. Dabei haben wir zum Formen der Ausgabe auch Gebrauch von .xslt-Dateien gemacht, die Anweisungen zur Aufbereitung der Inhalte enthalten. In den Beiträgen haben wir uns noch keine Gedanken um den Export von Inhalten aus Text- oder Memofeldern gemacht, die als CDATA markiert werden sollen. Was CDATA überhaupt ist und wie Sie Ihre Daten als solche markieren, zeigt dieser Beitrag.

Die beiden Beiträge, in denen wir uns um den Export von Daten aus Access-Tabellen in XML-Dateien gekümmert haben, heißen XML-Export ohne VBA (www.access-im-unternehmen.de/1045) und XML-Export mit VBA (www.access-im-unternehmen.de/1046). Hier haben wir beispielsweise die Tabelle tblKategorien, deren Werte aus den Feldern Beschreibung (Memo) und Abbildung (OLE-Objekt) gegebenenfalls einfach in herkömmliche XML-Elemente geschrieben wurden – also etwa so:

<xml version="1.0" encoding="UTF-8">
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" 
                           generated="2016-09-04T17:33:45">
   <tblKategorien>
     <KategorieID>1</KategorieID>
     <Kategoriename>Getränke</Kategoriename>
     <Beschreibung>Alkoholfreie Getränke, Kaffee, Tee, 
                                        Bier</Beschreibung>
   </tblKategorien>
   ...
</dataroot>

Unser Ziel ist aber nun, den Inhalt des Feldes Beschreibung wie folgt im XML-Dokument zu speichern:

<Beschreibung><![CDATA[Alkoholfreie Getränke, Kaffee, Tee, Bier]]></Beschreibung>

Innerhalb des Beschreibung-Elements sollen also noch ein öffnendes <![CDATA[ und ein schließendes ]]> um den Inhalt herum eingefügt werden.

Was aber ist CDATA überhaupt und was ist unser Nutzen, wenn wir den Inhalt des Elements damit einfassen Gelegentlich kommt es vor, dass die in der Datenbank enthaltenen Zeichenketten auch Zeichen wie das Kleiner(<)- oder Größer-Zeichen(>) enthalten. Solange sich dieses in einem Feld einer Access-Tabelle befindet, machen diese keinen ärger. Wenn Sie einen solchen Inhalt aber in ein XML-Dokument exportieren, dann würde dies als Element-Markup interpretiert werden. Wie Sie wissen, werden das Größer- und das Kleiner-Zeichen ja zum Markieren des Beginns und des Endes eines XML-Elements verwendet ().

Taucht dann innerhalb dieser Markierungen im Inhalt eines dieser Zeichen auf, wird es nicht als Zeichen, sondern als neues Elementmarkup ausgewertet. Im folgenden Beispiel war jemand faul und hat statt des Wortes kleiner das Kleiner-Zeichen verwendet:

<b>Die Anzahl der Artikel dieser Kategorie ist < als die der übrigen Kategorien.

Soll dies nun in ein XML-Dokument exportiert werden, wird Folgendes daraus:

<b><Bes</b>chreibung>Die Anzahl der Artikel dieser Kategorie ist < als die der übrigen Kategorien.</Beschreibung>

Das Kleiner-Zeichen wird also automatisch durch < ersetzt, eine sogenannte HTML-Entität. Wenn das nicht geschehen würde, weil wir das XML-Dokument beispielsweise nicht über den eingebauten XML-Export erstellen, sondern per VBA, erhielten wir die folgende Zeile:

<b><Bes</b>chreibung>Die Anzahl der Artikel dieser Kategorie ist < als die der übrigen Kategorien.</Beschreibung>

Würden Sie diese Datei in einem XML-Editor öffnen, würde diese beispielsweise die Fehlermeldungen aus Bild 1 liefern. Das heißt also, dass wir entweder mit der Darstellung mit den Entitäten wie eben < für das Kleiner-Zeichen leben müssen oder aber den Inhalt als CDATA-Block ausgeben.

Fehlermeldungen beim Anzeigen einer XML-Datei mit unzulässigen Markupzeichen

Bild 1: Fehlermeldungen beim Anzeigen einer XML-Datei mit unzulässigen Markupzeichen

Anwendungsfälle für CDATA

Während es oft durch Zufall geschieht, dass ein Zeichen in einer Tabelle landet, das für die Ausgabe in ein XML-Dokument speziell behandelt werden muss, gibt es auch Anwendungsfälle, bei denen dies regelmäßig vorkommt. Wenn Sie etwa in einem Tabellenfeld den Inhalt eines XML-Dokuments selbst speichern und dieses als Teil eines XML-Dokuments exportieren wollen, sollten Sie dieses der Einfachheit halber einfach in einen CDATA-Block einfassen.

Ansatz mit Bordmitteln

Die beiden oben genannten Beiträge haben die Möglichkeiten des XML-Exports direkt über die Benutzeroberfläche sowie per VBA vorgestellt. Den Weg über die Benutzeroberfläche lassen wir an dieser Stelle zunächst außen vor, da wir davon ausgehen, dass XML-Exporte, wenn überhaupt, auch regelmäßig stattfinden und dass die immer gleiche Abfolge von Schritten über den Export-Assistenten keine Dauerlösung ist. Stattdessen schauen wir uns die kleine Routine aus Listing 1 an, die den Export und die Transformation in zwei Schritten vollzieht. Der erste Schritt verwendet die ExportXML-Methode des Application-Objekts, um die Tabelle tblKategorien in die Datei Kategorien_Untransformiert.xml des aktuellen Anwendungsordners zu exportieren.

Public Sub ExportUndXSLT()
     Dim objUntransformiert As MSXML2.DOMDocument
     Dim objXSLT As MSXML2.DOMDocument
     Dim objTransformiert As MSXML2.DOMDocument
     Application.ExportXML acExportTable, "tblKategorien", CurrentProject.Path & "\Kategorien_Untransformiert.xml"
     Set objUntransformiert = New MSXML2.DOMDocument
     objUntransformiert.Load CurrentProject.Path & "\Kategorien_Untransformiert.xml"
     Set objXSLT = New MSXML2.DOMDocument
     objXSLT.Load CurrentProject.Path & "\Kategorien.xslt"
     Set objTransformiert = New MSXML2.DOMDocument
     objUntransformiert.transformNodeToObject objXSLT, objTransformiert
     objTransformiert.Save CurrentProject.Path & "\Kategorien_Transformiert.xml"
End Sub

Listing 1: Export mit einer .xslt-Vorlage, welche ein Feld in einen CDATA-Block einfasst

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar