¿Cómo generar clases .NET 4.0 desde xsd?

317

¿Cuáles son las opciones para generar .NET 4.0 c # clases (entidades) a partir de un archivo xsd, usando Visual Studio 2010?

Bastien Vandamme
fuente
@drzaus Tenía este trabajo en el pasado, pero ahora cuando agrego uno se genera como una clase DataSet en lugar de las clases que esperaría. Solo agrego un elemento existente y selecciono el archivo XSD.
msmucker0527

Respuestas:

490

Suficientemente simple; simplemente ejecute (en el símbolo del sistema vs)

xsd your.xsd /classes

(que creará your.cs). Sin embargo, tenga en cuenta que la mayoría de las opciones intrínsecas aquí no han cambiado mucho desde 2.0

Para las opciones, use xsd /?o vea MSDN ; Por ejemplo /enableDataBindingpuede ser útil.

Marc Gravell
fuente
83
"C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / language: CS your.xsd
GeorgesC
2
Gravell al rescate otra vez! Aunque esta respuesta es 100% correcta, en mi caso me pareció más fácil agregar la ruta del directorio xsd.exe a la variable de entorno PATH. Mi computadora -> propiedades -> avanzado -> variables de entorno -> Ruta - y agrego "C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Herramientas \" (por supuesto preste mucha atención a las versiones de Windows y .NET específicas de su máquina) - ¡codificación feliz!
pimbrouwers
15
Para el caso, tiene varias definiciones de esquema interconectadas, solo asígneles un nombre. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra
56

xsd.exe como lo menciona Marc Gravell. La forma más rápida de comenzar a usar IMO.

O si necesita más flexibilidad / opciones:

Complemento xsd2code VS (Codeplex)

Serge Wautier
fuente
10
No pude conseguir que xsd2code funcionara para mí. xsd.exe es más robusto, pero tiene problemas con los esquemas que tienen grupos "circulares".
Jeff el
xsd2code funciona en visual studio 2017 y era exactamente lo que estaba buscando. primero debe ejecutarlo en el directorio de archivos de programa (x86), luego usar el instalador vsix. entonces funciona muy bien. fue SUPER SUPERIOUR para el xsd.exe que generó matrices [] [] en lugar de lists.i tenía un .xsd gigante y necesito crear clases para serializar el XML. xsd.exe no generaría código serializable (.net core 2) y xsd2code funcionó muy bien
hanzolo
La versión actualizada de XSD2CODE para Visual Studio 2015 e 2017 está aquí: marketplace.visualstudio.com/…
Gianpiero
El xsd2code original ahora es xsd2code ++. La edición comunitaria está disponible en VS Marketplace
Gerd K
17

Le muestro aquí la forma más fácil de usar Vs2017 y Vs2019 Abra su xsd con Visual Studio y genere un archivo xml de muestra como se sugiere en la url .

  1. Una vez que abrió su xsd en la vista de diseño como se muestra a continuación, haga clic en el explorador de esquemas xml ingrese la descripción de la imagen aquí

2. Dentro del "Explorador de esquemas XML", desplácese hacia abajo para encontrar el nodo raíz / de datos. Haga clic derecho en el nodo raíz / datos y se mostrará "Generar XML de muestra". Si no se muestra, significa que no está en el nodo del elemento de datos pero sí en cualquiera de los nodos de definición de datos.

ingrese la descripción de la imagen aquí

  1. Copie su Xml generado en el portapapeles
  2. Cree una nueva clase vacía en su solución y elimine la definición de clase. Solo debe permanecer el espacio de nombres
  3. Mientras el puntero del mouse se enfoca dentro de su clase, elija EDITAR-> Pegar especial-> Pegar Xml como clases
batmaci
fuente
Desafortunadamente, esto no garantiza generar todas las clases, pero es un truco COOL.
John Zabroski
1
@JohnZabroski, ¿tuvo algún caso de que no funcionó para usted? Depende de xml de muestra, si puede crear xml de muestra con todas las clases y miembros, no hay razón para perder ninguna clase y miembro.
Batmaci
Mi punto es que el paso 2 no garantiza que funcione. Pero es un truco genial.
John Zabroski
Maravillosa respuesta. Te mereces unas cervezas frías !!
HenryGuillen17
14

xsd.exe no funciona bien cuando tiene referencias circulares (es decir, un tipo puede poseer un elemento de su propio tipo directa o indirectamente).

Cuando existen referencias circulares, uso Xsd2Code. Xsd2Code maneja bien las referencias circulares y funciona dentro del VS IDE, lo cual es una gran ventaja. También tiene muchas características que puede usar, como generar el código de serialización / deserialización. Sin embargo, asegúrese de activar GenerateXMLAttributes si está generando serialización (de lo contrario, obtendrá excepciones para ordenar si no está definido en todos los elementos).

Ninguno de los dos funciona bien con la función de elección. terminarás con listas / colecciones de objetos en lugar del tipo que deseas. Recomendaría evitar la elección en su xsd si es posible ya que esto no serializa / deserializa bien en una clase fuertemente tipada. Sin embargo, si no te importa esto, entonces no es un problema.

Cualquier función en xsd2code se deserializa como System.Xml.XmlElement, lo cual me parece realmente conveniente, pero puede ser un problema si desea objetos con tipos fuertes. A menudo uso cualquiera cuando permito datos de configuración personalizados, por lo que es conveniente pasar un XmlElement a otro deserializador XML que esté definido de forma personalizada en otro lugar.

VotoCafé
fuente
Agregué xsd2code mirando tu respuesta. ¿Necesitamos cambiar algo para que se encargue de las referencias de grupo circulares? No funciona para mí con las propiedades predeterminadas
Jyotsna Sonawane
No tuve que hacer nada especial para que funcionara con referencias circulares. Si publica el xml como una nueva pregunta y agrega un enlace aquí, me alegra echarle un vistazo.
VoteCoffee
10

Para una solución rápida y perezosa , (y no usar VS en absoluto) pruebe estos convertidores en línea:

  • convertidor de xsd a xml aquí
  • convertidor xmltocsharp aquí

XSD => XML => clases de C #

Ejemplo 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>

Convierte a 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>

Que se convierte a esta estructura de clase:

   /* 
    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; }
    }

}

¡Atención! Tenga en cuenta que esto es solo para comenzar, ¡los resultados obviamente necesitan mejoras!

cnom
fuente
Muchas gracias. Esto puede usarse como un buen ejemplo para aquellos que están aprendiendo XML Schema y XML en .NET
theeranitp
Maravillosa respuesta. ¡Te mereces unas cervezas frías!
HenryGuillen17
5

Lo uso XSDen un script por lotes para generar .xsdarchivos y clases XMLdirectamente:

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%
hdoghmen
fuente
2

El comando que funcionó en mi caso fue:

xsd /c your.xsd 
Melchia
fuente
1

La respuesta de Marc Gravells fue adecuada para mí, pero mi xsd tenía una extensión de .xml. Cuando usé el programa xsd me dio:
- The table (Amt) cannot be the child table to itself in nested relations.

Según este KB325695 , renombré la extensión de .xml a .xsd y funcionó bien.

Igoris Azanovas
fuente
1

Utilicé xsd.exeen el símbolo del sistema de Windows.

Sin embargo, dado que mi xml hizo referencia a varios xml en línea (en mi caso, http://www.w3.org/1999/xlink.xsdque hace referencia http://www.w3.org/2001/xml.xsd), también tuve que descargar esos esquemas, ponerlos en el mismo directorio que mi xsd y luego enumerar esos archivos en el comando:

"C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / language: CS your.xsd xlink.xsd xml.xsd

Aske B.
fuente
Ese no sería el mercado de Amazon XSD donde creaste clases por ahora, ¿verdad? :-) Tuve que trabajar con ellos una vez, nunca más los tocaré o haré ningún trabajo en C # usando archivos XSD de Amazon, hay tal desastre es irreal.
Shawty
@shawty Estaba trabajando con estándares GIS - WFS y WMS - que se definen por XSD grandes, circulares y con referencias cruzadas. Fue un gran lío xsd.exeporque no le gustan las referencias circulares, pero al final tuve éxito.
Aske B.
sí, esa hubiera sido mi segunda suposición. Visto que son demasiado, emabrgo no tan malo como material Amazonas, aunque ... me da pesadillas recordando estremecimientos
Shawty
0

Junto con WSDL, tenía archivos xsd. Lo anterior no funcionó en mi caso dio error. Funcionó de la siguiente manera

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