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


  • Ancien MVP SharePoint 8 ans ...
    Des projets .Net, SharePoint 2013 ou Office 365 ??

    Contactez-nous :

Archives

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

- Compte rendu : SharePoint / O365 : des pratiques pour une meilleure productivité par The Mit's Blog le 12-12-2014, 18:11

- [TFS] Suppression des feature SQL Entreprise en masse par Blog de Jérémy Jeanson le 12-06-2014, 09:18

- [Clean Code] règles de nommage par Fathi Bellahcene le 12-04-2014, 22:59

- Windows To Go 10 et Upgrades impossibles par Blog de Jérémy Jeanson le 12-04-2014, 21:38

- SharePoint OnPremise: Statistiques d’utilisation pour traquer les sites fantomes par Blog Technique de Romelard Fabrice le 12-03-2014, 10:28

- SharePoint 2007: Script PowerShell permettant le backup de toutes les collections de sites d’une application Web par Blog Technique de Romelard Fabrice le 12-02-2014, 10:00

- Xamarin : un choix précieux par .net is good... C# is better ;) le 12-01-2014, 15:10

- Office 365: Comparaison des composants pour préparer votre migration de SharePoint 2007 vers Office 365 par Blog Technique de Romelard Fabrice le 11-28-2014, 16:20

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40