Quelles sont les options pour générer des classes (entités) c .NET 4.0 à partir d'un fichier xsd, à l'aide de Visual Studio 2010?
Quelles sont les options pour générer des classes (entités) c .NET 4.0 à partir d'un fichier xsd, à l'aide de Visual Studio 2010?
Réponses:
assez simple; il suffit d'exécuter (à l'invite de commande vs)
xsd your.xsd /classes
(qui va créer your.cs
). Notez, cependant, que la plupart des options intrinsèques ici n'ont pas beaucoup changé depuis 2.0
Pour les options, utilisez xsd /?
ou consultez MSDN ; par exemple, /enableDataBinding
peut être utile.
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe comme mentionné par Marc Gravell. Le moyen le plus rapide de devenir opérationnel avec l'OMI.
Ou si vous avez besoin de plus de flexibilité / d'options:
Complément VS x2code VS (Codeplex)
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' url suggérée.
2. Dans «XML Schema Explorer», faites défiler vers le bas pour trouver le nœud racine / données. Cliquez avec le bouton droit sur le nœud racine / données et il affichera «Générer un échantillon XML». S'il ne s'affiche pas, cela signifie que vous n'êtes pas sur le nœud d'élément de données mais que vous êtes sur l'un des nœuds de définition de données.
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 VS IDE, ce qui est un gros plus. 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 la commande si elles ne sont pas définies sur tous les éléments).
Aucun ne fonctionne bien avec la fonction de choix. vous vous retrouverez avec des listes / collections d'objets au lieu du type que vous souhaitez. Je recommanderais d'éviter le choix dans votre xsd si possible car cela ne sérialise pas / désérialise bien dans une classe fortement typée. Si vous ne vous souciez pas de cela, cependant, ce n'est pas un problème.
Toute fonctionnalité de xsd2code se désérialise en System.Xml.XmlElement que je trouve vraiment pratique mais qui peut être un problème si vous voulez des objets typés forts. J'en utilise souvent quand j'autorise des données de configuration personnalisées, donc un XmlElement est pratique à passer à un autre désérialiseur XML qui est personnalisé ailleurs.
Pour une solution rapide et paresseuse (et sans utiliser VS du tout), essayez ces convertisseurs en ligne:
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 dans 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! Prenez en compte qu'il ne s'agit que de Get-You-Started, les résultats ont évidemment besoin d'être affinés!
J'utilise XSD
dans un script batch pour générer directement des .xsd
fichiers et des classes 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%
La réponse de Marc Gravells était bonne pour moi mais mon xsd l'était avec l'extension .xml. Quand j'ai utilisé le programme xsd, cela a donné:
- The table (Amt) cannot be the child table to itself in nested relations.
Selon ce KB325695, j'ai renommé l'extension de .xml en .xsd et cela a bien fonctionné.
J'ai utilisé xsd.exe
dans l'invite de commande Windows.
Cependant, comme mon xml faisait référence à plusieurs xml en ligne (dans mon cas, http://www.w3.org/1999/xlink.xsd
qui fait référence http://www.w3.org/2001/xml.xsd
), je devais également télécharger ces schémas, les mettre dans le même répertoire que mon xsd, puis lister ces fichiers dans la commande:
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / langue: CS your.xsd xlink.xsd xml.xsd
xsd.exe
parce qu'il n'aime pas les références circulaires, mais j'ai réussi à la fin.
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