XML schreiben mit dem Document Object Model

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

Im Artikel “XML-Dokumente erstellen mit XmlWriter” haben wir beschrieben, wie Sie XML-Dokumente mit der XmlWriter-Klasse schreiben. Dort können Elemente nur sequenziell hinzugefügt werden. Die Methoden des Object Document Models erlauben eine wesentlich flexiblere Vorgehensweise. Dieser Artikel zeigt, wie Sie mit dem Document Object Model neue XML-Dokumente erstellen und Elemente der verschiedenen Typen hinzufügen und mit Daten füllen.

Beispieldaten

Die Beispiele aus dem ersten Teil des Artikels finden Sie im Beispielprojekt XmlBeispiele aus dem Download.

Erstellen eines neuen XML-Dokuments

Im Artikel XML lesen mit dem Document Object Model (www.datenbankentwickler.net/****) haben Sie neue XML-Dokument-Objekte erstellt und diese mit Load oder LoadXml befüllt. Nun wollen wir ein neues, leeres XML-Dokument erstellen und dieses speichern. Die Mindestanforderung ist dabei, dass das Dokument ein Stammelement enthält. Um das mit VB zu realisieren, benötigen wir wie in den vorherigen Artikeln einen Verweis auf den Namespace System.Xml:

Imports System.Xml

Danach können wir mit der folgenden Methode ein neues XmlDocument erstellen. Bevor wir dieses speichern können, fügen wir das Stammelement in zwei Schritten hinzu:

  • Erstellen eines neuen Elements des Typs XmlElement mit der CreateElement-Methode des XmlDocument-Objekts und
  • Hinzufügen dieses Elements mit der AppendChild-Methode an das XML-Dokument aus objXml.

Danach können wir das Dokument mit Save und dem gewünschten Dateipfad speichern:

Private Sub btnDokumentErstellenDOM_Click(sender As Object, e As RoutedEventArgs)
     Dim objXml As XmlDocument
     Dim objElement As XmlElement
     Dim strDocument As String
     strDocument = "C:\...\BestellverwaltungDOM.xml"
     objXml = New XmlDocument
     objElement = objXml.CreateElement("Bestellverwaltung")
     objXml.AppendChild(objElement)
     objXml.Save(strDocument)
End Sub

Das Dokument enthält nun schlicht folgenden Text:

<Bestellverwaltung />

Prolog hinzufügen

Für manche Anwendungen ist es wichtig, dass die XML-Datei einen Prolog enthält, also folgende Zeile:

<xml version="1.0" encoding="utf-8">

Diese nennt man auch Processing Instruction. Und genau so ein Objekt gibt es auch im Namespace System.Xml. Um dieses zu erstellen, deklarieren wir eine Variable des Typs XmlProcessingInstruction sowie eine für den Inhalt dieses Objekts:

Dim objPI As XmlProcessingInstruction
Dim strPI As String

Dann schreiben wir den Text in strPI und erstellen mit der Methode CreateProcessingInstruction das XmlProcessingInstruction-Element. Der erste Parameter ist der Name, der hinter < erscheinen soll, also xml, der zweite die Angabe der gewünschten Name-Wert-Paare. Danach hängen wir das Element wie herkömmliche Elemente mit der AppendChild-Methode an das Dokument an und speichern es anschließend:

strPI = "version=""1.0"" encoding=""utf-8"""
objPI = objXml.CreateProcessingInstruction("xml", strPI)
objXml.AppendChild(objPI)
...
objXml.Save(strDocument)

Das Ergebnis lautet, kombiniert mit den Anweisungen des ersten Beispiele, wie folgt:

<xml version="1.0" encoding="utf-8">
<Bestellverwaltung />

Da wir eine solche Processing Instruction allen XML-Dokumenten voranstellen, gliedern wir die notwendigen Anweisungen in eine eigene Methode aus, die wie folgt aussieht:

Public Sub AddProcessingInstruction(ByVal objXml As XmlDocument)
     Dim objPI As XmlProcessingInstruction
     Dim strPI As String
     strPI = "version=""1.0"" encoding=""utf-8"""
     objPI = objXml.CreateProcessingInstruction("xml", strPI)
     objXml.AppendChild(objPI)
End Sub

Den Aufruf können wir dann so in die eigentliche Methode zum Erstellen des XML-Dokuments einstreuen:

AddProcessingInstruction(objXml)

Unterelemente hinzufügen

Unser XML-Dokument besteht nun gerade mal aus der Processing Instruction und dem Stammelement Bestellverwaltung. Weitere Elemente müssen wir zwingend dem Stammelement unterordnen. Dieses haben wir aber bereits mit objElement referenziert, sodass wir eigentlich direkt loslegen können. Allerdings machen wir uns direkt an dieser Stelle Gedanken über die Benennung der XmlElement-Variablen, denn wir werden ja vielleicht noch weitere verschachtelte Elemente wie Kunden, Bestellungen und Bestellpositionen einfügen wollen und wir benötigen für alle zumindest eine Objektvariable je Typ. Also ändern wir den Namen der Objektvariablen für das Stammelement in objBestellverwaltung. Die folgenden Elemente wollen wir dann objKunden, objKunde, objBestellungen, objBestellung und so weiter nennen. Als Erstes wollen wir nur das Unterelement Kunden hinzufügen. Dazu legen wir die Variable objKunden mit dem Typ XmlElement an.

Dieser weisen wir dann das mit der CreateElement von objXml erstellte Objekt mit dem Namen Kunden zu. Allerdings hängen wir das Kunden-Element nicht an das XML-Dokument aus objXml an, sondern an das Element aus objBestellverwaltung:

Private Sub btnDokumentErstellenDOM_Unterelemente_Click(sender As Object, e As RoutedEventArgs)
     ...
     Dim objKunden As XmlElement
     ...
     objBestellverwaltung = objXml.CreateElement("Bestellverwaltung")
     objXml.AppendChild(objBestellverwaltung)
     objKunden = objXml.CreateElement("Kunden")
     objBestellverwaltung.AppendChild(objKunden)
     objXml.Save(strDocument)
End Sub

Das Ergebnis sieht dann genau wie gewünscht aus:

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