web-dev-qa-db-fra.com

Comparaison des générateurs de code XSD

Je fais des recherches sur la génération de code à partir de fichiers de schéma xsd. Mes exigences:

  • Doit générer du code C # 2.0 (ou supérieur), en utilisant des collections génériques si nécessaire.
  • Doit générer des commentaires à partir des commentaires xsd
  • Doit générer du code entièrement sérialisable.
  • Devrait pouvoir générer des types de base réutilisables lors de la génération de plusieurs xsd avec les mêmes inclus.

(Voir aussi mes autres questions: Comment puis-je générer plusieurs classes à partir de xsd avec des includes inclus? et Comment générer des commentaires à partir de balises xs: documentation dans un wsdl?

J'ai trouvé les options suivantes:

  1. Utilisez xsd.exe (fourni avec le SDK et Visual Studio)
  2. XSDCodeGen de Daniel Cazzulino
  3. Xsd2Code
  4. CodeXS
  5. XsdObjectGen de Microsoft
  6. XSDClassGen (semble manquer à l'action)

En ai-je manqué? Parce que (1), (2) et (5) ne génèrent pas de code 2.0, et j'ai des problèmes avec la sérialisation du code de (3). Qu'est-ce que vous utilisez lors de la génération de code?

73
edosoft

Je crois que XSD2Code est le meilleur outil actuellement disponible (en 2011).

Récemment, j’ai suivi le même processus d’analyse des outils disponibles, c’est pourquoi j’ai pensé pouvoir fournir une réponse actualisée concernant VS2010.

Notre pilote principal était que xsd.exe ne générait pas de document XML à partir des annotations XSD, ce que nous voulions, car nous avons des centaines de définitions de types. J'ai essayé tous les outils énumérés ci-dessus ainsi que d'autres et la plupart ont été obsolètes, non entretenus ou incapables de correspondre à la fonctionnalité actuelle de xsd.exe disponible dans VS2010.

Xsd2Code est cependant un outil superbe et semble être activement maintenu. Elle fournit toutes les fonctionnalités énumérées ci-dessus et bien plus encore. La page CodePlex propose également d’excellents exemples de la manière dont les différentes options affectent la sortie.

Il a également une intégration VS étroite, y compris une intégration de menu contextuel et un outil de construction personnalisé (ce qui signifie que si vous référencez les XSD dans votre projet et spécifiez l'outil personnalisé, il mettra automatiquement à jour le code lors de la mise à jour de XSD). Au total, nous avons économisé beaucoup de travail.

Un résumé rapide des autres outils que j'ai consultés:

  • Dingo - semble être plus aligné sur Java
  • XSDCodeGen - Plus d'une démonstration sur la rédaction d'un outil de construction personnalisé
  • CodeXS - Un très bon outil, mais moins d'intégration, de fonctionnalités et n'est plus maintenu
  • XSDObjectGen - Non maintenu, moins de fonctionnalités que le xsd.exe actuel
  • XSDClassGen - Impossible de le localiser
  • OXM Library - Recommander pour regarder ce projet, entretenu et très fonctionnel
  • LINQ to XSD - Très cool projet, mais pas ce que je cherchais

Addendum: Si vous décidez de continuer avec XSD2Code, je rencontre un certain nombre de problèmes lors de l'utilisation de l'outil de ligne de commande. En particulier, il existe des bogues dans le traitement des arguments qui nécessitent que certains arguments soient dans un certain ordre, ainsi que des dépendances non documentées (par exemple, les paramètres automatiques et la version .NET sont spécifiques à l’ordre et dépendants). Voici les étapes que j'ai utilisées pour générer le code à l'aide de XSD2Code, puis nettoyer la sortie - prenez les bits qui s'appliquent à vous si nécessaire:

Exécutez le fichier de commandes suivant pour générer le code initial, en modifiant les chemins d'accès aux emplacements appropriés:

@echo off

set XsdPath=C:\schemas
set OutPath=%XsdPath%\Code
set ExePath=C:\Progra~1\Xsd2Code
set Namespace=InsertNamespaceHere

echo.Starting processing XSD files ...
for /f %%a IN ('dir %XsdPath%\*.xsd /a-d /b /s') do call:ProcessXsd %%a

echo.Finished processing XSD files ...
echo.&pause&
goto:eof

:ProcessXsd
%ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /if- /dc /sc /eit
echo.Processed %~n1
goto:eof

Effectuez les étapes suivantes pour ranger le code généré, si nécessaire:

  1. Regex replace - projet actuel, cas, mot entier - [System.Runtime.Serialization.DataContractAttribute (Nom: b * =: b *: q,: b espace de noms: b =: b * {: q })] avec [DataContract (Namespace =\1)]
  2. Remplacer - projet actuel, cas, mot entier - [System.Runtime.Serialization.DataMemberAttribute ()] par [DataMember]
  3. Regex remplace - le projet actuel, le cas, le mot entier - System.Nullable\<{: w}> avec \ 1 \?
  4. Regex remplacer - documents ouverts, cas, mot entier - {: w} TYPE avec \ 1
  5. Remplacer - documents ouverts, cas, Word entier - System.DateTime par DateTime, puis ajouter les instructions d’utilisation manquantes
  6. Remplacer - documents ouverts, cas, mot entier - [System.Xml.Serialization.XmlIgnoreAttribute ()] par [XmlIgnore]
  7. Remplacer - projet en cours - System.Xml.Serialization.XmlArrayAttribute avec XmlArray
  8. Remplacer - projet en cours - System.Xml.Serialization.XmlArrayItemAttribute par XmlArrayItem
  9. Regex remplace - projet en cours - , [: Wh] + ///\<remarques/\> avec ,

J'espère que ça aide quelqu'un.

60
Xcalibur

Je n'ai pas encore vérifié cela, mais Linq2XSD pourrait être une alternative utile. 

Je vais tenter le coup. LINQ avec génération XSD serait meilleur que l’un quelconque des outils que vous avez mentionnés - à condition que cela fonctionne bien.

8
Simon_Weaver

Projet OpenSource XSD to Classes a fonctionné parfaitement pour moi.

3
Stef Heyenrath

Essayez OxmLibrary - http://oxmlibrary.codeplex.com

2
maor

J'ai un projet il y a un peu plus d'un an, nous avons utilisé CodeXS. Avec quelques ajustements mineurs (un script qui a un peu nettoyé le code généré) cela a fonctionné. 

Il existe également Dingo , qui possède de très bonnes fonctionnalités d'extensibilité (dont nous n'avions pas besoin).

2
Steen

Le meilleur générateur de classe XSD que j'ai trouvé est thinktecture WSCF.blue .

  1. Correction du nommage. Cela signifie la casse et la plurisation des types et des noms de propriété.
  2. Crée un fichier séparé pour chaque classe.

Ou, si vous recherchez une solution T4, vous pouvez essayer XsdClassGen . Celui-ci ne fonctionne pas pour moi. Mais la bonne nouvelle est qu’il s’agit d’un fichier T4, il est donc facile de le réparer!

0
Josh Mouch