C# XML: die perfekte Mischung!

XML-Dateien sind aus der Software-Entwicklung nicht mehr wegzudenken – und bei .NET sind sie neben dem Speichern und Austauschen von Daten und Informationen zusätzlich auch für die Anwendungskonfiguration wichtig: das .NET eigene Konfigurationsmodell basiert auf XML.

XML hat im Gegensatz zu anderen Formaten den Vorteil, dass sich mit Hilfe von XSD-Dateien die Struktur und sogar die Werte und Wertpaare validieren lassen. Mit XSL/XSLT-Dateien lassen sich zudem XML-Inhalte hübsch darstellen: sie sind für die Ansicht, zB. im Browser gedacht.

XDocument vs. XmlDocument

Im .NET Framework gibt es zwei verschiedene Klassen, um mit XML-Dateien zu interagieren.

Das XmlDocument existierte zuerst, mit dem .NET Framework 2.0 und befindet sich im System.Xml-Namespace. Es wird auch als die klassische XML DOM API bezeichnet.

Hierbei wird das XML-Dokument nicht vollständig in den Arbeitsspeicher geladen, sondern man greift primär mit Hilfe von XPath – XML Path Language, eine Abfragesprache speziell für XML – auf die jeweiligen Inhalte einer XML-Datei zu.

XPath hat eine gewisse Einstiegshürde, weshalb der direkte Umgang – besonders gegenüber Programmiereinsteigern – mit XmlDocument nur noch in zwei Fällen direkt empfohlen wird:

  • Man arbeitet mit einer .NET Version kleiner 3.5
  • Man arbeitet mit sehr großen XML Dokumenten

Viel einfacher ist der Umgang mit XML-Dateien mit der XDocument-Klasse, die sich im System.Xml.Linq-Namespace befindet und mit .NET 3.5 erstmals verfügbar war.

XDocument lädt die XML-Datei sofort vollständig in den RAM. Hierbei kann mit Hilfe von Linq-Abfragen und ohne umständliches XPath sehr bequem die XML-Datei abgefragt und bearbeitet werden; gewohnt wie mit anderen .NET Objekten.

Es benötigt viel weniger Code, es ist einfacher zu lesen, zu warten und zu erweitern und ist besonders für Anfänger auch viel einfacher zu verstehen und zu lernen. Große Dateien, im mehrere hundert MB- oder gar GB-Bereich, können mit XDocument jedoch nicht bearbeitet werden, wenn das System nicht über die entsprechenden Ressourcen verfügt.

XML-Dateien in den Speicher zu laden ist sehr kostenintensiv bezogen auf den Arbeitsspeicher. So kann eine 500 MB XML-Datei mit vielen Eigenschaften und Einträgen mehrere Gigabyte an Arbeitsspeicher in Anspruch nehmen, wenn sie mit XDocument geladen wird.

Dies ist jedoch selten der Fall, weshalb abgesehen von diesem Defizits XDocument der XmlDocument-Klasse vorgezogen werden sollte.

Beispiel

Hier zunächst ein Beispiel einer XML-Datei

   <XMLRootName demo="SchwabenCode">
     <KindElement>Dies ist ein BeispielText</KindElement>
   </XMLRootName>

sowie ein jeweiliges Code-Snippet, wie XML-Datei mit der XmlDocument- und der XDocument-Klasse erstellt werden könnte.

XmlDocument Code

    XmlDocument xmlDoc = new XmlDocument( );
    XmlElement xmlRoot = xmlDoc.CreateElement( "XMLRootName" );
    root.SetAttribute( "demo", "SchwabenCode" );
    XmlElement child = xmlDoc.CreateElement( "KindElement" );
    child.InnerText = "Dies ist ein BeispielText";
    xmlRoot.AppendChild( child );
    xmlDoc.AppendChild( xmlRoot );

XDocument Code

XDocument doc = new XDocument(
   new XElement( "XMLRootName",
      new XAttribute( "demo", "SchwabenCode" ),
      new XElement( "KindElement", "Dies ist ein BeispielText" )));

Im XmlDocument-Beispiel ist zu sehen, dass deutlich mehr Code benötigt wird – und dabei auch noch schlechter zu lesen ist. Das XDocument-Beispiel hingehen ist viel kürzer und zudem auch noch wie eine art Baumstruktur geschachtelt, sodass die zukünftige Struktur der XML-Datei direkt aus dem Code ersichtlich wird.