Zur Abwechslung gibt es heute mal wieder einen technischen Artikel. Ich stand in meinem aktuellen Projekt vor der Aufgabenstellung, dass ich Informationen aus einer XML-Datei auslesen und verarbeiten muss. An sich nichts weltbewegendes, spätestens seit LINQ to XML kann das sogar Spaß machen. Für meinen aktuellen Fall wollte ich aber einen anderen Weg gehen und zwar mit Klassen, die das XML-Schema repräsentieren, um dann die XML-Datei direkt in Instanzen von diesen Klassen zu parsen. Also so ähnlich, wie beim Lesen von eigenen Config-Sections der app.config. Mit Hilfe der Jungs von Google habe ich herausgefunden, dass es ein Tool von Microsoft gibt, um genau diese Klassen automatisch zu erzeugen. Dieses will ich euch heute an einem Beispiel zeigen.
Nehmen wir an, wir bekommen Daten zu Wettermessungen im XML-Format geliefert und müssen diese verarbeiten. Eine Datei kann Infos zu mehreren Stationen enthalten, von denen zu jeder 1 bis n Messungen gemeldet werden. Eine Messung kann dann wiederum mehrere Einzelmessungen enthalten. Daraus entsteht folgendes Schema:
Die Darstellung stammt übrigens aus dem XML-Schema-Designer vom Visual Studio 2010. Den finde ich ganz nützlich, um ein Schema zu visualisieren, nur trifft es Designer nicht wirklich, denn bearbeiten kann man ein Schema damit nicht, bzw. nur sehr eingeschränkt.
Nachdem wir nun das Schema haben, müssen wir die Klassen generieren. Dazu gibt es das Tool xsd.exe, welches sich im bin-Verzeichnis des Microsoft SDKs (z. B. C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin) versteckt. Um für unser Beispiel C#-Klassen zu generieren, müssen wir es mit folgenden Parametern aufrufen:
xsd WetterMessungen.xsd /classes /namespace:SampleApplication.BusinessObjects
Nun haben wir eine Datei namens WetterMessungen.cs im aktuellen Verzeichnis. Mit dem Tool lassen sich noch ein paar andere Sachen machen, mehr dazu verrät die MSDN.
Die generierte Datei jetzt noch im Visual Studio in das Projekt einbinden und schon haben wir generierte Klassen für unser Schema. Die sind natürlich alle partial und können demnach noch individuell erweitert werden. Jetzt brauchen wir nur noch die Möglichkeit, eine XML-Datei in Instanzen dieser Klassen zu parsen. Dazu benutzen wir ganz einfach Deserialization:
(Gibt auf WordPress.com scheinbar keine Möglichkeit, Code formatiert darzustellen, daher als Bild. Ihr könnt den Code aber downloaden: Klick! Das war auch schon das ganze Geheimnis, nun können wir anhand eines XML-Schemas automatisch entsprechende Klassen generieren und XML-Dateien in Instanzen von diesen parsen.
Und im nächsten Teil zeige ich euch, wie man das ganze als Custom Tool für’s Visual Studio automatisieren kann, so dass die Klassen automatisch bei jeder Schema-Änderung generiert werden.

Verfasst von chefarbeiter 
