web-dev-qa-db-fra.com

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

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

263
Bastien Vandamme

assez simple; il suffit de courir (à l'invite de commande vs)

xsd your.xsd /classes

(ce qui va créer 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 /? ou voir MSDN ; par exemple /enableDataBinding peut être utile.

428
Marc Gravell

xsd.exe comme mentionné par Marc Gravell. Le moyen le plus rapide de démarrer et d’exécuter IMO.

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

Add-in xsd2code VS (Codeplex)

53
Serge Wautier

xsd.exe ne fonctionne pas bien lorsque vous avez des références circulaires (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 au sein de VS IDE, ce qui est un avantage considérable. Il comporte également de nombreuses fonctionnalités que vous pouvez utiliser, telles que la génération du code de sérialisation/désérialisation. Assurez-vous d’activer GenerateXMLAttributes si vous générez une sérialisation (sinon, vous aurez des exceptions pour la commande si elles ne sont pas définies sur tous les éléments).

Ni fonctionne bien avec la fonctionnalité de choix. vous vous retrouverez avec des listes/collections d'objets au lieu du type souhaité. Si possible, je vous recommande d'éviter le choix dans votre fichier xsd, car cela ne permet pas de sérialiser/désérialiser correctement dans une classe fortement typée. Si vous ne vous souciez pas de cela, alors, alors ce n'est pas un problème.

La fonctionnalité any de xsd2code se désérialise sous la forme System.Xml.XmlElement, ce que je trouve très pratique mais qui peut poser problème si vous souhaitez des objets typés forts. J'utilise souvent any lorsque j'autorise des données de configuration personnalisées. Il est donc pratique qu'un XmlElement passe à un autre désérialiseur XML personnalisé défini ailleurs.

14
VoteCoffee

J'utilise XSD dans un script batch pour générer directement le fichier .xsd et les classes à partir de XML

set XmlFilename=Your__Xml__Here
set WorkingFolder=Your__Xml__Path_Here

set XmlExtension=.xml
set XsdExtension=.xsd

set XSD="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1\Tools\xsd.exe"

set XmlFilePath=%WorkingFolder%%XmlFilename%%XmlExtension%
set XsdFilePath=%WorkingFolder%%XmlFilename%%XsdExtension%

%XSD% %XmlFilePath% /out:%WorkingFolder%
%XSD% %XsdFilePath% /c /out:%WorkingFolder%
3
hdoghmen

La commande qui a fonctionné dans mon cas était:

xsd /c your.xsd 
0
Melchia

J'ai utilisé xsd.exe dans l'invite de commande Windows.

Cependant, comme mon fichier xml faisait référence à plusieurs fichiers xml en ligne (dans mon cas, http://www.w3.org/1999/xlink.xsd, qui référence http://www.w3.org/2001/xml.xsd), je devais également télécharger ces schémas, les placer dans le même répertoire que mon xsd, puis répertorier ces fichiers dans la commande:

"C:\Program Files (x86)\SDK Microsoft\Windows\v8.1A\bin\NETFX 4.5.1 Outils\xsd.exe"/classes/language: CS votre.xsd xlink.xsd xml.xsd

0
Aske B.

Pour une solution quick and lazy, (et n'utilisez pas de VS du tout), essayez ces convertisseurs en ligne:

  • xsd-to-xml-converter 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 convertit à 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 que ceci est juste pour commencer, les résultats évidemment doivent être améliorés!

0
cnom

Avec WSDL, j'avais des fichiers xsd. Ce qui précède n'a pas fonctionné dans mon cas a donné une erreur. Cela a fonctionné comme suit

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
0
Hamit YILDIRIM