Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

The Mit's Blog

En plus d'intégrer et skier, il sait même écrire !
(Blog de Renaud Comte)

Actualités

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 :

  1. Tout parser par le XML (et de préférence un XPathNavigator ou XmlReader)
  2. 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 :
Posted: vendredi 15 avril 2005 12:14 par themit
Classé sous : ,

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Après Montréal, ce sera Barcelone, rendez-vous à la European SharePoint Conference 2014 ! par Le blog de Patrick [MVP SharePoint] le il y a 7 heures et 4 minutes

- Emportez votre sélection de la MSDN dans la poche ? par Blog de Jérémy Jeanson le 04-17-2014, 22:24

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le 04-17-2014, 17:03

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le 04-17-2014, 16:54

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le 04-17-2014, 06:34

- [ SharePoint Summit Montréal 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit Montréal 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit Montréal 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57