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

- Changer l’adresse d’une ferme Office Web Apps associée à SharePoint par Blog de Jérémy Jeanson le il y a 7 heures et 43 minutes

- Une ferme #SharePoint 2013 dans @Azure en quelques clics (1ère partie) ! par Le blog de Patrick [MVP SharePoint] le 08-28-2014, 18:52

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le 08-20-2014, 16:31

- [ #Yammer ] How to change interface language ? Comment changer la langue de l’interface ? par Le blog de Patrick [MVP SharePoint] le 08-20-2014, 14:21

- Onedrive Sync Engine Host : CPU à 100% par Le petit blog de Pierre / Pierre's little blog le 08-06-2014, 22:22

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52