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();
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);
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"));
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.
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);
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.
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.