Nov 12

Generieren von .NET Klassen aus XSDs bzw. XML mit mehreren Namespaces

Tag: Tipps und TricksTorsten @ 23:40

Sofern man XSD Schemata zur Verfügung hat, lassen sich daraus mit diversen Tools .NET Klassen generieren. Siehe dazu auch früherer Blogeintrag XSD aus XML mit mehreren Namespaces generieren.

Das Visual Studio Boardmittel xsd.exe ist eine Möglichkeit:
xsd.exe /classes /namespace:MyNamespace B.xsd .\A.xsd

Der Trick mit dem .\ am Ende benennt die Ausgabedatei genau so, also z.B. A.cs.
Ansonsten werden alle Input-Dateinamen konkatoniert (B_A.cs)

Das Ergebnis ist durchaus brauchbar, allerdings sind die möglichen Optionen bei der Generierung beschränkt.

Unter anderem werden alle Collections als Arrays definiert, man hat keine Möglichkeit hier z.B. Listen generieren zu lassen (es sei denn, man ändert nach der Generierung alles manuell wieder ab).
Auch gibt es keine Integration in die Visual Studio IDE.

Eine recht gute Alternative stellt Xsd2Code dar: http://xsd2code.codeplex.com/
Das Tool integriert sich in die VisualStudio (2010 bis 2013) IDE und bietet vielfältige Einstellungsmöglichkeiten, was die Generierung angeht:

Xsd2Code

Xsd2Code

Man kann u.a. automatisiert Clone() Methoden anlegen lassen, INotifyPropertyChanged für DataBindings mit generieren lassen, u.v.m. Und insbesondere die Angabe des Typs für Collections (List<T>, BindingList<T>, etc.) lässt sich steuern.

Das Generieren lässt sich direkt per Rechtsklick auf eine XSD-Datei in der IDE und „Run Xsd2Code generation“ anstoßen.

Sofern mehrere aufeinander referenzierende XSDs existieren, reicht die Generierung auf der Hauptdatei (die intern die anderen Referenziert).

Es empfiehlt sich, die Xsd2Code-Option Serialization\GenerateXmlAttributes auf true zu setzen, sofern man beim Deserialisieren Fehlermeldungen über eine vermeindlich inkorrekt aufgebaute XML-Datei erhalten sollte.

Einen kleinen Wehrmutstropen hat das Tool: es generiert keine vollständigen XML-Kommentare für alle Public Member, so dass man, sofern man „Treat Warnings As Errors“ als best practise im Projekt aktiviert hat, über viele Warnungs/Errors stolpert. Da das aber generierter Code ist, lässt sich die Warnung gezielt mittels manuell am Anfang eingefügter Zeile
#pragma warning disable 1591
deaktivieren.

Man sollte bei generiertem Code eh nicht mehr viel manuell ändern, denn man weiß nie, wann man auf Grund von Änderungen ein erneutes Generieren anstoßen muss. Und dann wären alle Änderungen weg. Hier ist es ratsamer Ergänzungen in weiteren parziellen Klassen zu halten (die Tools generieren die Klassen deswegen auch standardmäßig als public partial class, damit man eigene Änderungen ebenfalls partial in getrennten Dateien pflegen kann).

Mit den so erzeugten Klassen lässt sich jetzt das ursprüngliche XML deserialisieren bzw. neue XMLs auf Grundlage der XSD per Serialisierung rausschreiben.