Dateien aus XML-Dokumenten speichern und lesen

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Dateien aus XML-Dokumenten speichern und lesen

Webservices können nicht nur Texte und Zahlen liefern oder entgegennehmen, sondern auch etwa mit Bildern oder PDF-Dateien arbeiten. So könnten Sie einen Webservice nutzen, der Bilder bearbeitet oder umwandelt, oder mit einem, der ein PDF für eine bestimmte Dienstleistung liefert und dazu in einen XML-Response verpackt – zum Beispiel eine Versandmarke et cetera. Für solche Fälle kann es hilfreich sein zu wissen, wie Sie die endlosen Zahlenkombinationen aus dem XML-Dokument in eine Datei umwandeln – und umgekehrt.

Dateien aus XML-Dokumenten exportieren

Wenn Sie gelegentlich Dateien im XML-Format verarbeiten, kommt dort sicher auch mal eine Base64-kodierte Datei vor. Eine einfache XML-Datei mit dem Root-Element file, das zwei weitere Elemente namens filename (zum Speichern des Dateinamens) und data (mit dem kodierten Inhalt einer PDF-Datei) enthält, sieht beispielsweise wie folgt aus – nur je nach Dateigröße viel länger:

<?xml version="1.0"?>
<file>
   <filename>Beispieldatei.pdf</filename>
   <data>JVBERi0xLjQNJeLjz9MNCjk3NCAwIG9iag08PC9MaW5lYXJpeIIFsgMTA5OCA3MjddPj4NZW5kb2JqDSAgICAg...</data>
</file>

Einen besseren Eindruck vom Umfang einer solchen Datei erhalten Sie durch einen Blick auf Bild 1. Die hier abgeschnittene Darstellung besteht tatsächlich aus über 17.000 Zeilen!

Beispiel für eine in einem XML-Dokument gespeicherte Datei

Bild 1: Beispiel für eine in einem XML-Dokument gespeicherte Datei

Und dieses Durcheinander wollen wir nun in eine Datei umwandeln? Aber natürlich! Mehr dazu gleich.

Voraussetzungen

Für die Beispiele aus diesem Beitrag (und auch, wenn Sie diese in Ihrer eigenen Datenbank nutzen möchten) benötigen Sie zwei zusätzliche Verweise, nämlich auf die Bibliothek Microsoft XML, v6.0 und Microsoft ActiveX Data Objects 6.1 Library (s. Bild 2).

Verweise der Beispieldatenbank

Bild 2: Verweise der Beispieldatenbank

Datei auslesen

Die Steuerung übernimmt die Prozedur aus Listing 1, in der Sie auch festlegen, welche XML-Datei als Quelle dient, aus welchem Element der Name der zu erzeugenden Datei und aus welchem Element der kodierte Dateiinhalt kommt. Die Prozedur erstellt ein neues DOMDocument-Objekt und lädt den Inhalt der Datei ArtikelInXML.xml, deren Inhalt Sie oben bereits kennen gelernt haben, in dieses Objekt. Die nächste Anweisung trägt das Verzeichnis der aktuellen Datenbank gefolgt von einem Backslash () und dem aus dem Element filename ermittelten Dateinamen, hier Beispieldatei.pdf, in die Variable strZieldatei ein.

Public Sub XMLElementInDatei()
     Dim objDocument As MSXML2.DOMDocument60
     Dim strXMLDatei As String
     Dim strZieldatei As String
     Dim objData As MSXML2.IXMLDOMElement
     Set objDocument = New MSXML2.DOMDocument60
     strXMLDatei = CurrentProject.Path & "ArtikelInXML.xml"
     objDocument.Load strXMLDatei
     strZieldatei = CurrentProject.Path & "" & objDocument.selectSingleNode("//filename").nodeTypedValue
     Set objData = objDocument.selectSingleNode("//data")
     WriteFileFromBytes strZieldatei, DecodeBase64(objData.nodeTypedValue)
End Sub

Listing 1: Auslesen einer Datei aus einem XML-Dokument in das Filesystem

Mit der IXMLDOMElement-Variablen objBild referenzieren wir den Inhalt des Elements data unserer Zieldatei. Schließlich rufen wir gleich zwei Hilfsfunktionen in einer Zeile auf: Die Funktion WriteFileFromBytes erwartet den Namen der zu erstellenden Datei sowie ein Byte-Array mit dem zu schreibenden Dateiinhalt als Parameter und soll die Datei in das Datei­sytem schreiben. Das Byte-Array steuert mit dem zweiten Parameter die Funktion DecodeBase64 bei, welche mit dem Inhalt des Elements Data aus der Variablen objData versorgt wird.

Data-Element dekodieren

Schauen wir uns als Erstes die Funktion DecodeBase64 an. Diese erwartet einen String als Parameter, in diesem Fall den Inhalt des data-Elements unserer XML-Datei. Und jetzt kommt der Clou: Wir nutzen keinen selbst programmierten Algorithmus, um die Dekodierung vorzunehmen, sondern wir erstellen ein XML-Dokument, fügen diesem ein neues Element namens tmp hinzu, stellen den Datentyp auf bin.base64 ein und füllen es über seine Text-Eigenschaft mit dem Wert aus dem Parameter strBase64. Die XML-Bibliothek erledigt die Umwandlung dann automatisch für uns, sodass wir über die Eigenschaft nodeTypedValue des Elements auf das resultierende Byte-Array zugreifen können. Diesen Wert weisen wir dem Rückgabewert DecodeBase64 der Funktion zu, der als Byte() deklariert ist (s. Listing 2).

Private Function DecodeBase64(strBase64 As String) As Byte()
     Dim objDocument As MSXML2.DOMDocument60
     Dim objElement As MSXML2.IXMLDOMElement
     Set objDocument = New MSXML2.DOMDocument60
     Set objElement = objDocument.createElement("tmp")
     objElement.DataType = "bin.base64"
     objElement.Text = strBase64
     DecodeBase64 = objElement.nodeTypedValue
End Function

Listing 2: Dekodieren von Base64 in ein Byte-Array

Byte-Array in Datei schreiben

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]