Créer les classes C# à partir d’un schéma XSD

Un collègue de boulot se retrouve avec un problème : il doit mettre en place un reporting au XML validé auprès d’un schéma XSD. Il pensait que cela lui prendrait longtemps et serait compliqué. Il fut véritablement surpris d’avoir un prototype de solution aussi facilement et rapidement.

POCO C#

Créer un POCO à partir du XSD

Dans le Developer Command Prompt for Visual Studio, taper la ligne suivante :

  Xsd myschema.xsd /classes 

Cela crée un fichier myschema.cs qui contient des objets qui respectent le XSD

Pour les options : xsd /? ou XML Schema Definition Tool (Xsd.exe)

Intégrer la classe dans Visual Studio

Après avoir créer un nouveau projet dans Visual Studio et y avoir ajouter la classe générée précédemment, il faut ajouter de quoi sérialiser l’objet.

Comme il s’agit d’une classe partielle et que le XSD peut être amené à évoluer, je vous conseille de créer une autre classe partielle qui contiendra les méthodes associées à cet objet.

Voici deux méthodes utiles, l’une pour exporter au format texte pour le debug, l’autre pour exporter dans un fichier.

public string ToXML()
{
    var stringwriter = new StringWriter();
    var serializer = new XmlSerializer(this.GetType());
    serializer.Serialize(stringwriter, this);
    return stringwriter.ToString();
}

public void ToFile(string filePath)
{
    System.Xml.Serialization.XmlSerializer writer = new XmlSerializer(this.GetType());

    System.IO.FileStream file = System.IO.File.Create(filePath);

    writer.Serialize(file, this);
    file.Close();
}

Connexion aux données

Je passe rapidement sur cette partie car ce n’est pas le sujet.

Ma source de données est une base Oracle. Autant dire que je m’attendais au pire. Oracle.ManagedDataAccess m’a énormémenent facilité la vie.

Ce post de stackoverflow fait gagner un temps pécieux : Connecting to Oracle using Oracle.ManagedDataAccess.

Oracle.ManagedDataAccess sur NuGet

Valider le XML généré

Il est toujours bon de vérifier un résultat et en l’ocurrence valider le XML généré en fonction du schéma XSD.

//Constants.Path.Xsd  = System.AppDomain.CurrentDomain.BaseDirectory + @"Resources\CCSS.xsd";

XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(AppSettings["XsdNamespace"], Constants.Path.Xsd);
XDocument xdoc = XDocument.Load(Constants.Path.TmpXmlExport);
bool errors = false;

StringBuilder sb = new StringBuilder();
xdoc.Validate(schemas, (o, ex) =>
{
    sb.AppendLine(string.Format("{0}", ex.Message));
    errors = true;
});

sb.Insert(0,string.Format("custOrdDoc {0}", errors ? "did not validate" : "validated") + Environment.NewLine, 1);
Txt1.Text = sb.ToString();

Alors facile!

Références

XML Schema Definition Tool (Xsd.exe)

Connecting to Oracle using Oracle.ManagedDataAccess.

Oracle.ManagedDataAccess sur NuGet