.Net-Klassen für XML-Schema generieren

12. Dezember 2010

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.


Lines of Code

7. August 2010

Die Lines of Code (LoC) eines Software-Projekts werden von Controllern und anderen Management-Und-Möchtegern-Management-Mitgliedern gerne herangezogen, um irgendwelche völlig abwegigen Vergleiche oder Bewertungen aufzustellen. Mein persönliches Highlight in der Hinsicht war die Idee eines Projektleiters, die Qualität einzelner Module in gemeldeten Kunden-Fehlern pro 1.000 LoC zu bestimmen. Wäre diese Idee in die Tat umgesetzt worden, hätte das die Entwickler dazu verleitet, den Code kosmetisch unschön zu strecken, um möglichst viele LoC zu generieren und so in der Qualitäts-Statistik gut abzuschneiden, was wiederum die Wartbarkeit des Codes verschlechtert hätte.

Ich selber halte die Lines of Code für eine interessante Statistik, um eine ungefähre Hausnummer für die Projekt-Größe zu ermitteln. Mehr aber auch nicht. Alle weiterführenden Statistiken sind für die Tonne.

Um für ein .Net-Projekt die Lines of Code zu ermitteln, gibt es mehrere Wege. Der einfachste Weg geht über die “Code Metrics”, die ab der Team System-Version in Visual Studio integriert sind. Nun wird die aber privat niemand wirklich besitzen, so dass ein anderer Weg her muss. Es gibt einige externe Add-Ins, welche aber Nutzern der Express-Editionen nicht viel nützen, da diese keine Add-Ins unterstützen. Aus diesem Grund habe ich für mich einen eigenen LoC-Counter entwickelt.

Das Programm kann für eine .Net-Solution die LoC für alle zugehörigen Dateien (inkl. XML und XSD) ermitteln. Im oberen Grid werden die Ergebnisse der einzelnen Dateien angezeigt, im unteren die Gruppierung nach Projekten. Es werden die Gesamtanzahl der Zeilen, die echten Code-Zeilen, sowie Kommentar- und Leer-Zeilen ermittelt. Wie im Screenshot zu sehen ist, werden auch Designer-Dateien mitgezählt.

Falls Interesse besteht, würde ich das Programm veröffentlichen.


Follow

Bekomme jeden neuen Artikel in deinen Posteingang.

Join 809 other followers