XSD.exe en plugin : vive la sérialisation
Travaillant avec des Web Services SharePoint de recherche, je me suis retrouvé avec des structures de données XML pas trop sympathiques, disons, verbeuses avec un schema bien complexe.
Le reflexe du DataSet.Load ne passant pas, je devais me résoudre :
- Tout parser par le XML (et de préférence un XPathNavigator ou XmlReader)
- Faire des classes dédiées et utiliser le XmlSerializer
J'ai décidé de m'appuyer sur la seconde solution ! 
Soucis, il faut écrire les classes et faire tout le mappage par les petits attributs
System.Xml.Serialization.XmlTypeAttribute(...
Bien que l'XMLSerializer nous masque déja une bonne partie du travail, le mappage reste encore a faire et manuellement...
Un bon developpeur/intégrateur
se devant d'être efficace, il n'y a pas de mal à utiliser les outils de VS.NET 
Je parle de fameux XSD.EXE capable d'un schema de générer un classe de serialisation C# VB, il suffit ensuite de l'implémenter tout simplement
Génial non ?
Mais allons encore un peu plus loin dans l'ergonomie voulez vous.
XSD.EXE est une application en ligne de commande. Bien Chris Sells a sortie justement un wrapper pour VS.NET

http://www.sellsbrothers.com/tools/#xsdClassesGen
>>> il suffit de rajouter "SBXsdClassesGenerator" dans l'attribut d'outil personnalisé et hop la classe C#/VB.NET est générée
Bref, j'importe mon schéma, je génère et je code tout simplement dans la foulée le reste de mon traitement
Ca devient du bonheur
Et si on insistez encore un peu !
Certains feraient la remarque que les classes générées utilisent des variables publiques plutot que des propriétés GET/SET ...
Dommage vous me direz, c'est bien legitime
En effet, pour binder directement ce genre de classe, le grid winform n'affiche que les propriétes publique et non les variables
Alors comment faire ?
Simple : Expressions réguliére
Daniel Cazzulino nous fournit simplement une regex qui avec un vieux ctrl-H fait le travail
Find what
: public {[^ ]+} {[^ ]+};
Replace with
: public \1 \2 \n\t\t{\n\t\t\tget { return _\2; }\n\t\t\tset { _\2 = value; }\n\t\t}
private \1 _\2;
De mieux en mieux je dirais.
Les feedbacks n'étant pas si inutile, une macro le fait directement dans votre fichier cs/vb généré
********* Macro for changing public fields to properties
Option Strict Off
Option Explicit Off
Imports EnvDTE
Imports System.Diagnostics
Imports System.Windows
Imports System.Windows.Forms
Imports System
Imports System.Text
Imports System.Text.RegularExpressions
Public Module Pub2Prop
Sub PubField2Prop()
Dim doc As Document = DTE.ActiveDocument
Dim Content As String
Dim Changed As String
Dim reg As Regex
Dim MatchEval As New MatchEvaluator(AddressOf ReplaceCC)
Dim textDoc As TextDocument = _
CType(doc.Object("TextDocument"), TextDocument)
If doc.ProjectItem.ContainingProject.Kind = _
VSLangProj.PrjKind.prjKindCSharpProject Then
textDoc.Selection.SelectAll()
Content = textDoc.Selection.Text()
reg = New Regex("public ([^ ]+) ([^ ]+);")
Changed = reg.Replace(Content, MatchEval)
textDoc.Selection.Delete()
textDoc.Selection.SelectAll()
textDoc.Selection.Insert(Changed)
End If
End Sub
Function ReplaceCC(ByVal m As Match) As String
Dim gc As GroupCollection = m.Groups
Dim sb As StringBuilder = New StringBuilder
sb.Append("public ").Append(gc(1).Value)
_.Append(" ").Append(gc(2).Value).Append(vbCrLf)
_.Append(vbTab).Append(vbTab).Append("{").Append(vbCrLf)
sb.Append(vbTab).Append(vbTab).Append(vbTab)
_.Append("get { return _").Append(gc(2).Value).Append("; }").Append(vbCrLf)
sb.Append(vbTab).Append(vbTab).Append(vbTab).Append("set { _")
_.Append(gc(2).Value).Append(" = value; }").Append(vbCrLf)
sb.Append(vbTab).Append(vbTab).Append("} private ")
_.Append(gc(1).Value).Append(" _").Append(gc(2).Value).Append(";")
Return sb.ToString()
End Function
End Module
***** End Module
Et voila, un probléme de résolue et un nouveau petit outil de plus dans ma toolbox VS.NET
Finalement, c'est rapide la sérialisation, non ?
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :