Générer une classe C # à partir de XML

Réponses:

338

Oui, en utilisant xsd.exe

D:\temp>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.xsd'.

D:\temp>xsd test.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.cs'.

Remarques

Il peut être utile de savoir comment modifier le répertoire de l'invite de commandes du développeur en d: \ temp.

Si vous générez des classes pour un tableau multidimensionnel, il existe un bogue dans le générateur XSD.exe, mais il existe des solutions de contournement .

Darin Dimitrov
la source
18
Pour utiliser, xsdexécutez l' invite de commande du développeur pour VS2013 dans votre menu d'outils.
Jess
13
xsd.exepeut être trouvé sous:C:\Program Files (x86)\Microsoft SDKs\Windows
Julian
7
soyez averti si vous avez un gros fichier XML complexe, la classe générée sera si moche qu'elle sera presque inutilisable;)
Matthew Lock
3
Pour moi a xsd.exeété trouvé à: C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
user1991179
414

Si vous travaillez sur un projet .NET 4.5 dans VS 2012 (ou plus récent), vous pouvez simplement coller votre fichier XML en tant que classes.

  1. Copiez le contenu de votre fichier XML dans le presse-papiers
  2. Dans l'éditeur, sélectionnez l'endroit où vous souhaitez que vos cours soient collés
  3. Dans le menu, sélectionnez EDIT > Paste Special > Paste XML As Classes
miszczu
la source
22
Je souhaite simplement que ces propriétés générées automatiquement soient implémentées, comme pour "Coller JSON en tant que classes". Actuellement, cela signifie un résultat de code gonflé 6 fois, ce qui est beaucoup plus difficile à lire. Cela seul me fait malheureusement chercher un autre outil.
Nicholas Petersen
1
Cela a-t-il été omis de VS 2013?
Roger
3
@Roger Je n'ai pas utilisé VS 2013, mais je pense que cette fonctionnalité devrait être là, assurez-vous que votre projet cible le framework .NET 4.5
miszczu
2
C'est beaucoup plus rapide que xsd, mais la sortie est à peu près la même.
Jess
4
Si vous n'avez pas de resharper, utilisez l'expression régulière, remplacez par public (\w+) (\w+)\r\n +\{\r\n +get\r\n +\{\r\n +return this.*;\r\n +\}\r\n +set\r\n +\{\r\n +this.*;\r\n +\}\r\n +\}\r\n=> public $1 $2 { get; set; }et `private \ w + \ w + Field; \ r \ n \ r \ n`
AlexDev
44

Au début, je pensais que la pâte spéciale était le Saint Graal! Mais ensuite je l'ai essayé et mes cheveux sont devenus blancs comme le film Indiana Jones.

Mais maintenant j'utilise http://xmltocsharp.azurewebsites.net/ et maintenant je suis plus jeune que jamais.

Voici un segment de ce qu'il a généré:

namespace Xml2CSharp
{
    [XmlRoot(ElementName="entry")]
    public class Entry {
        [XmlElement(ElementName="hybrisEntryID")]
        public string HybrisEntryID { get; set; }
        [XmlElement(ElementName="mapicsLineSequenceNumber")]
        public string MapicsLineSequenceNumber { get; set; }
D. Kermott
la source
5
La sortie de cet outil est agréable, mais je veux juste faire un avertissement là-bas pour ne pas soumettre de données sensibles à ce site (ou tout autre d'ailleurs). Bien que j'apprécie le service offert, il n'y a pas de politique de confidentialité et peu ou pas d'assurance que ce que vous collez ne sera pas enregistré et examiné, etc.
SvenAelterman
2
J'avais un fichier xml qui a des relations récursives (peut-être que cela s'appelle une relation circulaire, je ne suis pas sûr.) Les autres ont échoué mais xmltocsharp.azurewebsites.net a très bien réussi sur ce xml.
Koray
4
@ D.Kermott merci pour le lien du site Web, je l'ai regardé rapidement et il semble que cela fasse un bien meilleur travail que la pâte spéciale, le code semble plus propre, bien que mon test xml ait créé plus de classes, c'était beaucoup plus agréable à utiliser.
Harag
Dommage qu'il semble inverser l'ordre des classes (éléments extérieurs listés en dernier)
Savage
22

Je me rends compte que c'est un poste assez ancien et que vous avez probablement évolué.

Mais j'ai eu le même problème que vous, j'ai donc décidé d'écrire mon propre programme.

Le problème avec l'itinéraire "xml -> xsd -> classes" pour moi était qu'il venait de générer un morceau de code qui était complètement impossible à maintenir et j'ai fini par le turfer.

Il n'est en aucun cas élégant mais il a fait le travail pour moi.

Vous pouvez l'obtenir ici: veuillez faire des suggestions si vous l'aimez.

SimpleXmlToCode

Talon
la source
1
produit un code incorrect: // ELEMENTS [XmlIgnore] public DateTime Value {get; ensemble; } [XmlText] chaîne publique ValueString {get {return Value? "vrai faux"; } set {Value = value == "true"; }}
André Fiedler
Et les constructeurs sont inutiles + vous devez inclure des commentaires pour les membres visibles du public
André Fiedler
1
Pour ma défense, c'est quelque chose que j'ai giflé très rapidement qui a fonctionné pour moi. Je n'y suis pas retourné mais n'hésitez pas à contribuer au repo tout changement.
Talon
Je l'utilise depuis quelques mois - ce n'est pas parfait, mais c'est très utile et je trouve qu'il génère un XML beaucoup plus lisible / plus simple que la pâte de VS2013 en XML. Très apprécié Talon.
codechinchilla
6

Vous devriez considérer svcutil ( question svcutil )

Xsd.exe et svcutil fonctionnent tous les deux sur le fichier de schéma XML (.xsd). Votre XML doit être conforme à un fichier de schéma à utiliser par l'un de ces deux outils.

Notez que divers outils tiers existent également pour cela.

ng5000
la source
3

Vous pouvez utiliser xsd comme suggéré par Darin.

De plus, il est recommandé de modifier le fichier test.xsd pour créer un schéma plus raisonnable.

type="xs:string"peut être changé en type="xs:int"pour des valeurs entières
minOccurs="0"peut être changé en minOccurs="1"où le champ est requis
maxOccurs="unbounded"peut être changé en maxOccurs="1"où un seul élément est autorisé

Vous pouvez créer des xsd-s plus avancés si vous souhaitez valider davantage vos données, mais cela vous donnera au moins des types de données raisonnables dans le c # généré.

Albin Sunnanbo
la source
1

Utilisez la syntaxe ci-dessous pour créer une classe de schéma à partir d'un fichier XSD.

C:\xsd C:\Test\test-Schema.xsd /classes /language:cs /out:C:\Test\
Kiran.Bakwad
la source
0

Pour convertir XML en classe C #:

  • Accédez à Microsoft Visual Studio Marketplace: - https://marketplace.visualstudio.com
  • Dans la barre de recherche, saisissez le texte: - xml to class code tool
  • Téléchargez, installez et utilisez l'application

Remarque: dans le temps, cette application peut être remplacée, mais il y a de fortes chances qu'un autre outil fasse la même chose.

J Wood
la source