Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

Der XmlTextWriter (Teil 1)


Die Extensible Markup Language (XML) ist schon lange ein Standard für einfache aber flexible Datenspeicherung. Die Einsatzmöglichkeiten von XML sind weit gestreut und auch im .NET-Framework kommt XML nicht zu kurz. Es gibt für XML Operation sogar einen eigenen Namespace:
using System.Xml;
Es gibt mehrere unterschiedliche Möglichkeiten, XML Dateien zu erzeugen und einzulesen. In den nächsten Beispielen werden wir einige kennenlernen. Der einfachste Weg eine XML-Datei zu erzeugen, ist der XmlTextWriter. Dieser erzeugt einen Stream, der in eine Datei gespeichert werden kann.
XmlTextWriter myXMLWriter = new XmlTextWriter ("test.xml",null);
Die Instanzierung eines XmlTextWriter ist denkbar einfach, da man hier schon den Namen der zu erstellenden Datei angeben kann. Diese Datei wird mit der Kodierung UTF8 geschrieben - eine Angabe die durchaus wichtig ist, wenn man in der Datei Sonderzeichen oder Umlaute benutzen will. Natürlich sind auch andere Kodierungen möglich. Diese können alternativ angegeben werden.
XmlTextWriter myXMLWriter = new XmlTextWriter ("test.xml",Encoding.ASCII);
Außer in eine Datei kann auch direkt auf die Konsole ausgegeben werden. Die Angabe einer Kodierung ist dabei aber nicht möglich.
XmlTextWriter myXMLWriter = new XmlTextWriter(Console.Out);
Damit ist der XMLWriter angelegt. Ihn mit Leben zu füllen ist nicht weiter schwierig.
myXMLWriter.WriteStartDocument(true);
Der Befehl "WriteStartDocument" fügt dem Dokument die XML-Deklaration mit der Versionsnummer "1.0" hinzu. Der Parameter gibt an, ob das XML-Attribut "standalone=yes" gesetzt wird. Sollte das XML-Dokument weitere Dateien benötigen um einwandfrei zu funktionieren, sollte das Attribut "standalone=no" sein. Dies erreicht man durch den Wert "false" als Parameter.

Wie auch in HTML bestehen XML-Dokumente aus öffnenden und schließenden Tags, zwischen denen sich die Informationen befinden. Diese Tags werden in XML "Knoten" oder "Nodes" genannt und können verschachtelt werden, um so auch komplexe Strukturen abzubilden. Will man aber nur einen einfachen Textwert schreiben, so genügt hier ein einzelner Befehl.
myXMLWriter.WriteElementString("Name", "Muster");
myXMLWriter.WriteElementString("Vorname", "Max");
myXMLWriter.WriteElementString("Ort", "Dortmund");
Hier werden gleich drei neue Knoten angelegt und mit passenden Inhalten gefüllt. Natürlich ist es etwas unübersichtlich auf diese Art eine Datei zu erzeugen, die Daten von mehr als einer Person enthält. In so einem Fall ist es sinnvoll, die Personendaten in einem neuen Knoten zusammenzufassen.

Um einen neuen Knoten zu öffnen, gibt es den Befehl "WriteStartElement" und "WriteEndElement", um ihn wieder zu schließen. In diesem Knoten kann nun ein Element stehen oder aber auch eine ganze Liste von Elementen, die auch wieder Unterknoten enthalten können.
myXMLWriter.WriteStartElement("Person");
myXMLWriter.WriteElementString("Name", "Muster");
myXMLWriter.WriteElementString("Vorname", "Max");
myXMLWriter.WriteElementString("Ort", "Dortmund");
myXMLWriter.WriteEndElement();
Wie man sieht, hat "WriteStartElement" als Parameter den Namen des zu erzeugenden Knotens, nämlich "Person". Hingegen kommt "WriteEndElement" ganz ohne Parameter aus. Das ist leicht nachzuvollziehen, denn "WriteEndElement" schließt immer den zuletzt erzeugten Knoten. Wäre dies anderes, könnte man überlappende Verschachtelungen konstruieren. Das ist in XML aber nicht erlaubt!

Nachdem wir das XML-Dokument nach unseren Wünschen gestaltet haben, fehlen noch wenige Schritte um daraus eine Datei zu erzeugen. Das Dokument muß geschrieben werden und der XmlTextWriter, der ja wie erwähnt mit einem Stream arbeitet, muß geschlossen werden. Im Programm sieht das dann so aus:
myXMLWriter.WriteEndDocument();
myXMLWriter.Close();
Jetzt noch einmal den kompletten Programmcode im Zusammenhang:
XmlTextWriter myXMLWriter = new XmlTextWriter("test.xml",null);
myXMLWriter.WriteStartDocument(true);
myXMLWriter.WriteStartElement("Person");
myXMLWriter.WriteElementString("Name", "Muster");
myXMLWriter.WriteElementString("Vorname", "Max");
myXMLWriter.WriteElementString("Ort", "Dortmund");
myXMLWriter.WriteEndElement();
myXMLWriter.WriteEndDocument();
myXMLWriter.Close();
Die daraus resultierende XML-Datei sieht dann so aus:

<?xml version="1.0" standalone="yes">
<Person>
<Name>Muster</Name>
<Vorname>Max<Vorname>
<Ort>Dortmund</Ort>
</Person>

Im nächsten Teil beschäftigen wir und mit komplexeren XML-Struktuten und Knotenattributen.