¿Cuáles son las opciones para generar .NET 4.0 c # clases (entidades) a partir de un archivo xsd, usando Visual Studio 2010?
¿Cuáles son las opciones para generar .NET 4.0 c # clases (entidades) a partir de un archivo xsd, usando Visual Studio 2010?
Respuestas:
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 /enableDataBinding
puede ser útil.
xsd schema1.xsd schema2.xsd schema3.xsd /c
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)
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 .
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.
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.
Para una solución rápida y perezosa , (y no usar VS en absoluto) pruebe estos convertidores en línea:
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!
Lo uso XSD
en un script por lotes para generar .xsd
archivos y clases XML
directamente:
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 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.
Utilicé xsd.exe
en 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.xsd
que 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
xsd.exe
porque no le gustan las referencias circulares, pero al final tuve éxito.
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