Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

XmlDocument


Wie zu Anfang erwähnt, gibt es im .NET-Framework mehrere Möglichkeiten XML-Dateien zu erzeugen. War der XmlWriter noch eine recht übersichtliche Angelegenheit, wird es ein wenig komplizierter, wenn man mit dem XmlDocument arbeitet. Aber das soll uns nicht abschrecken. Die Instanzierung ist wie so oft denkbar einfach.
XmlDocument myXMLdoc = new XmlDocument();
Ebenfalls wissen wir schon, dass sich XML-Dokumente aus Knoten zusammensetzten. Nachdem wir nun ein neues, aber leeres Dokument erstellt haben, müssen wir nun Knoten erzeugen und unserem Dokument anhängen.
XmlNode docNode = myXMLdoc.CreateElement("Daten");
Zusätzlich soll dieser Knoten wieder Attribute bekommen, die wir noch aus dem letzten Beispiel kennen. Eine Versionsnummer und das Erstellungsdatum.
XmlAttribute version_attribute = myXMLdoc.CreateAttribute("Version");
version_attribute.Value = "1.0";

XmlAttribute erstellt_attribute = myXMLdoc.CreateAttribute("Erstellt");
erstellt_attribute.Value = DateTime.Now.ToString();
Unschwer zu erkennen sind Knoten (XmlNode) und Attribute (XmlAttribute) - eigene Datentypen die separat erstellt werden müssen. Attribute bestehen aus zwei wichtigen Daten: dem Attributnamen und dessen Wert der durch "Value" angegeben wird. Dass wir nun nur einen Knoten und Attribute erzeugt haben bedeutet nicht, dass diese auch in unserem Dokument enthalten sind. Das Hinzufügen zum XmlDocument Element ist ein weiterer Schritt. Fügen wir also zuerst dem Knoten die beiden neuen Attribute hinzu.
docNode.Attributes.Append(version_attribute);
docNode.Attributes.Append(erstellt_attribute);
Anschließend fügen wir diesen Knoten dem Dokument hinzu.
myXMLdoc.AppendChild(docNode);
Damit ist der erste Knoten in unserem Dokument erstellt und hinzugefügt. Erstellen wir nun einen Knoten, der selbst weitere Unterknoten enthält.
XmlNode connectionNode = myXMLdoc.CreateElement("connection");
Zwar werden alle Knoten schon als Elemente des Xml-Dokumentes angelegt, aber noch fehlt die Information ob und an welcher Position die Knoten eingefügt werden. Erzeugen wir aber noch drei weitere Knoten:
XmlNode descriptionNode = myXMLdoc.CreateElement("description");
descriptionNode.AppendChild(myXMLdoc.CreateTextNode("Die Beschreibung"));

XmlNode hostnameNode = myXMLdoc.CreateElement("hostname");
hostnameNode.AppendChild(myXMLdoc.CreateTextNode("Ein Hostname"));

XmlNode usernameNode = myXMLdoc.CreateElement("username");
usernameNode.AppendChild(myXMLdoc.CreateTextNode("Ein Benutzername"));
Auch hier sind das Erstellen eines Knotens und das tatsächliche Füllen mit Informationen zwei Schritte. Ich verwende hier den Befehl "CreateTextNode", da Text in der Regel dem entspricht, was ich in die Datei schreiben möchte. Es gibt viele weitere Möglichkeiten auf die ich an dieser Stelle nicht eingehen werde.
Diese drei neu erzeugten Knoten sollen nun Unterknoten des "connectionNode" werden. Dieser Knoten, der selbst keine Textinhalte enthält, dient nur zur Strukturierung der Unterknoten.
connectionNode.AppendChild(descriptionNode);
connectionNode.AppendChild(hostnameNode);
connectionNode.AppendChild(usernameNode);
Der Befehl "AppendChild" hängt tatsächlich einen Knoten - wie ein Kind - an einen anderen Knoten an. Auch wie im richtigen Leben ist es hier eine typische Eltern-Kind-Beziehung. Ein Elternknoten kann zwar mehrere Kinder haben, aber ein Kindknoten immer nur einen Elternknoten. Versucht man den Knoten erneut an anderer Stelle im Dokument anzuhängen, wird er an der alten Position in der Struktur zunächst entfernt.
Jetzt, da wir den "connectionNode" Knoten mit seinen Kindern verbunden haben, muss er nur noch an das Dokument angehängt werden.
docNode.AppendChild(connectionNode);
Um das ganze Dokument abschließend zu speichern, reicht wieder ein einziger Befehl.
myXMLdoc.Save("c:\\daten.xml");
Natürlich ist diese Art XML-Dokumente zu erstellen viel komplexer, als mit einem XmlWriter. Sie eröffnet aber auch viel mehr Möglichkeiten und Flexibilität, da Knoten und auch Attribute eigenständige Objekte sind, die an beliebigen Positionen im Dokument eingefügt werden können.