340 votes

Comment générer des classes .NET 4.0 à partir de xsd ?

Quelles sont les options pour générer des classes c# .NET 4.0 (entités) à partir d'un fichier xsd, en utilisant Visual Studio 2010 ?

0 votes

@drzaus Cela fonctionnait dans le passé, mais maintenant quand j'en ajoute un, il génère une classe DataSet au lieu des classes auxquelles je m'attendrais. J'ajoute simplement un élément existant et je sélectionne le fichier XSD.

522voto

Marc Gravell Points 482669

C'est assez simple ; il suffit d'exécuter (à l'invite de commande vs)

xsd your.xsd /classes

(ce qui créera your.cs ). Notez, cependant, que la plupart des options intrinsèques n'ont pas beaucoup changé depuis la version 2.0.

Pour les options, utilisez xsd /? o voir MSDN ; par exemple /enableDataBinding peut être utile.

91 votes

" C:\Program Fichiers (x86) \Microsoft SDKs \Windows\v8.1A\bin\NETFX 4.5.1 Outils \xsd.exe " /classes /langue:CS votre.xsd

3 votes

Le gravier à la rescousse, encore une fois ! Bien que cette réponse soit 100% correcte, dans mon cas, j'ai trouvé plus facile d'ajouter le chemin du répertoire xsd.exe à la variable d'environnement PATH. Mon ordinateur -> propriétés -> avancées -> variables d'environnement -> Path -- et ajoutez " C:\Program Fichiers (x86) \Microsoft SDKs \Windows\v8.1A\bin\NETFX 4.5.1 Tools" (bien sûr, faites attention aux versions Windows et .NET spécifiques à votre machine) - bon codage !

19 votes

Dans le cas où vous avez plusieurs définitions de schéma liées entre elles, il suffit de les nommer toutes. xsd schema1.xsd schema2.xsd schema3.xsd /c

57voto

Xsd.exe comme mentionné par Marc Gravell. C'est le moyen le plus rapide pour être opérationnel.

Ou si vous avez besoin de plus de flexibilité/options :

xsd2code Complément VS (Codeplex)

10 votes

Je n'ai pas réussi à faire fonctionner xsd2code. xsd.exe est plus robuste, mais a du mal avec les schémas qui ont des groupes "circulaires".

0 votes

Xsd2code fonctionne dans visual studio 2017 et c'est exactement ce que je cherchais. vous devez d'abord l'exécuter dans le répertoire program files (x86), puis utiliser le programme d'installation vsix. ensuite, il fonctionne très bien. il était BEAUCOUP SUPÉRIEUR à xsd.exe qui générait des arrays[][] au lieu de listes. j'avais un .xsd géant et j'ai besoin de créer des classes pour sérialiser le XML. xsd.exe ne voulait pas générer de code sérialisable (.net core 2) et xsd2code a bien fonctionné.

1 votes

La version mise à jour de XSD2CODE pour Visual Studio 2015 e 2017 est ici : marketplace.visualstudio.com/

30voto

batmaci Points 411

Je vous montre ici la manière la plus simple d'utiliser Vs2017 et Vs2019. Ouvrez votre xsd avec Visual Studio et générez un exemple de fichier xml comme dans l'exemple ci-dessous. url suggéré.

  1. Une fois que vous avez ouvert votre xsd dans la vue de conception comme ci-dessous, cliquez sur l'explorateur de schéma xml. enter image description here

2. Dans "XML Schema Explorer", faites défiler l'écran vers le bas pour trouver le nœud Root/data. Faites un clic droit sur le nœud Root/data et vous verrez apparaître "Generate Sample XML". Si ce n'est pas le cas, cela signifie que vous n'êtes pas sur le nœud des éléments de données mais sur l'un des nœuds de définition des données.

enter image description here

  1. Copiez votre Xml généré dans le presse-papiers
  2. Créez une nouvelle classe vide dans votre solution et supprimez la définition de la classe. Seul le Namespace doit rester
  3. Alors que le pointeur de votre souris se trouve à l'intérieur de votre classe, sélectionnez EDIT-> Collage spécial-> Collage de Xml comme classes

14voto

VoteCoffee Points 404

Xsd.exe ne fonctionne pas bien lorsque vous avez des références circulaires (c'est-à-dire qu'un type peut posséder un élément de son propre type directement ou indirectement).

Lorsque des références circulaires existent, j'utilise Xsd2Code. Xsd2Code gère bien les références circulaires et fonctionne dans l'IDE VS, ce qui est un gros avantage. Il possède également de nombreuses fonctionnalités que vous pouvez utiliser comme la génération du code de sérialisation/désérialisation. Assurez-vous d'activer GenerateXMLAttributes si vous générez la sérialisation (sinon vous obtiendrez des exceptions pour l'ordre s'il n'est pas défini sur tous les éléments).

Ni l'un ni l'autre ne fonctionne bien avec la fonction de choix. Vous vous retrouverez avec des listes/collections d'objets au lieu du type que vous voulez. Je recommanderais d'éviter le choix dans votre xsd si possible car cela ne se sérialise pas/désérialise bien dans une classe fortement typée. Si vous ne vous souciez pas de cela, alors ce n'est pas un problème.

La fonction any de xsd2code désérialise comme System.Xml.XmlElement ce que je trouve très pratique mais qui peut être un problème si vous voulez des objets fortement typés. J'utilise souvent any quand je veux autoriser des données de configuration personnalisées, alors un XmlElement est pratique pour passer à un autre désérialiseur XML qui est personnalisé et défini ailleurs.

0 votes

J'ai ajouté xsd2code en regardant votre réponse. Devons-nous changer quelque chose pour qu'il prenne en charge les références de groupes circulaires ? Cela ne fonctionne pas pour moi avec les propriétés par défaut

0 votes

Je n'ai rien eu à faire de spécial pour qu'il fonctionne avec des références circulaires. Si vous posez le xml comme une nouvelle question et ajoutez un lien ici, je serai heureux d'y jeter un œil.

12voto

cnom Points 798

Pour un solution rapide et paresseuse (et sans utiliser VS du tout), essayez ces convertisseurs en ligne :

  • Convertisseur xsd-xml ici
  • convertisseur xmltocsharp ici

XSD => XML => Classes C#

Exemple XSD :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Convertit en XML :

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<shiporder xsi:noNamespaceSchemaLocation="schema.xsd" orderid="string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <orderperson>string</orderperson>
  <shipto>
    <name>string</name>
    <address>string</address>
    <city>string</city>
    <country>string</country>
  </shipto>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>3229484693</quantity>
    <price>-6894.465094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2181272155</quantity>
    <price>-2645.585094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2485046602</quantity>
    <price>4023.034905803945093</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>1342091380</quantity>
    <price>-810.825094196054907</price>
  </item>
</shiporder>

Qui se convertit en cette structure de classe :

   /* 
    Licensed under the Apache License, Version 2.0

    http://www.apache.org/licenses/LICENSE-2.0
    */
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="shipto")]
    public class Shipto {
        [XmlElement(ElementName="name")]
        public string Name { get; set; }
        [XmlElement(ElementName="address")]
        public string Address { get; set; }
        [XmlElement(ElementName="city")]
        public string City { get; set; }
        [XmlElement(ElementName="country")]
        public string Country { get; set; }
    }

    [XmlRoot(ElementName="item")]
    public class Item {
        [XmlElement(ElementName="title")]
        public string Title { get; set; }
        [XmlElement(ElementName="note")]
        public string Note { get; set; }
        [XmlElement(ElementName="quantity")]
        public string Quantity { get; set; }
        [XmlElement(ElementName="price")]
        public string Price { get; set; }
    }

    [XmlRoot(ElementName="shiporder")]
    public class Shiporder {
        [XmlElement(ElementName="orderperson")]
        public string Orderperson { get; set; }
        [XmlElement(ElementName="shipto")]
        public Shipto Shipto { get; set; }
        [XmlElement(ElementName="item")]
        public List<Item> Item { get; set; }
        [XmlAttribute(AttributeName="noNamespaceSchemaLocation", Namespace="http://www.w3.org/2001/XMLSchema-instance")]
        public string NoNamespaceSchemaLocation { get; set; }
        [XmlAttribute(AttributeName="orderid")]
        public string Orderid { get; set; }
        [XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
    }

}

Attention ! Tenez compte du fait qu'il ne s'agit que d'une mise en route, les résultats ne seront pas les mêmes. évidemment besoin de raffinements !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X