Codefieber.de

IT-Blog

XML mit der XmlDocument Klasse schreiben

| Keine Kommentare

In dem vorherigen Eintrag habe ich über die XmlWriter-Klasse berichtet, mit deren Hilfe wir eine XML erstellen können. Doch für manche Situationen, vor allem, wenn dabei Aktualisierungen an einer bestehenden XML vollbracht werden sollen, hat sich die XmlDocument-Klasse als nützlich erwiesen. Negativer Punkt wäre hier allerdings der höhere Speicherverbrauch, vor allem bei großen XML-Dokumenten.

Hier ist ein Codebeispiel:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            XmlNode rootNode = xmlDoc.CreateElement("users");
            xmlDoc.AppendChild(rootNode);

            XmlNode userNode = xmlDoc.CreateElement("user");
            XmlAttribute attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "42";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "John Doe";
            rootNode.AppendChild(userNode);

            userNode = xmlDoc.CreateElement("user");
            attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "39";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "Jane Doe";
            rootNode.AppendChild(userNode);

            xmlDoc.Save("test-doc.xml");
        }
    }
}

Hier die herauskommende XML:

<users>
  <user age="42">John Doe</user>
  <user age="39">Jane Doe</user>
</users>

Wie man sieht, ist dies ein bisschen mehr als der objektorientierte Ansatz XmlWriter und es erfordert ein bisschen mehr Code. Wir instanziieren ein neues XmlDocument-Objekt, welches wir nutzen, um neue Elemente und Attribute mit der CreateElement()-Methode und der CreateAttribute()-Methode zu erstellen. Jedes Mal, wenn wir das tun, fügen wir die Elemente entweder direkt dem Dokument oder zu einem anderen Element hinzu. Wie im Beispiel zu sehen, wird das root-element (“user”) direkt an das Dokument und die user-elemente an das Root-Element angehängt. Attribute werden natürlich an die Elemente mit der Append()-Methode angehängt. Das gesamte XML-Dokument wird auf die Festplatte in der letzten Zeile mit der Save()-Methode geschrieben.

Nun, wie bereits erwähnt, erfordert dies ein wenig mehr Code als bei der Verwendung der XmlWriter-Klasse, aber stellen wir uns eine Situation vor, in der wir nur in einem bestehende XML-Dokument Änderungen vornehmen können. Mit der XmlWriter-Klasse müssten zuerst alle Informationen mit einem XmlReader gelesen, gespeichert, veränderndert und dann die gesamten Informationen zurück geschrieben werden. Da das XmlDocument im Speicher gehalten wird, ist die Aktualisierung einer bestehenden XML-Datei mit XmlDocument viel einfacher. Das folgende Beispiel öffnet die Datei “test-doc.xml” und erhöht das Alter aller Benutzer einem nach dem anderen.

So sieht das Ganze dann aus:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("test-doc.xml");
            XmlNodeList userNodes = xmlDoc.SelectNodes("//users/user");
            foreach(XmlNode userNode in userNodes)
            {
                int age = int.Parse(userNode.Attributes["age"].Value);
                userNode.Attributes["age"].Value = (age + 1).ToString();
            }
            xmlDoc.Save("test-doc.xml");           
        }
    }
}

Wir laden die XML-Datei und fragen Sie nach all den Knoten. Wir iterieren dann durch die Knoten, lesen die age-Attribute in eine Integer-Variable, und dann schreiben wir den Wert wieder zurück in den Knoten und Attribut, nachdem der Wert um 1 erhöht wurde. Zum Schluss speichern wir das Dokument wieder in die gleiche Datei und wenn man es öffnet, werden wir sehen, dass unsere Nutzer alle nur ein Geburtstag haben.

avatar

Autor: Pascal

Codefieber.de wird von Pascal Betke geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.