Quais são as opções para gerar classes c # do .NET 4.0 (entidades) a partir de um arquivo xsd, usando o Visual Studio 2010?
Quais são as opções para gerar classes c # do .NET 4.0 (entidades) a partir de um arquivo xsd, usando o Visual Studio 2010?
Respostas:
simples o suficiente; basta executar (no prompt de comando vs)
xsd your.xsd /classes
(que criará your.cs
). Observe, no entanto, que a maioria das opções intrínsecas aqui não mudou muito desde a versão 2.0
Para as opções, use xsd /?
ou consulte o MSDN ; por exemplo, /enableDataBinding
pode ser útil.
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe conforme mencionado por Marc Gravell. A maneira mais rápida de iniciar e executar o IMO.
Ou se você precisar de mais flexibilidade / opções:
xsd2code VS suplemento (Codeplex)
Eu mostro aqui a maneira mais fácil de usar o Vs2017 e o Vs2019 Abra o seu xsd com o Visual Studio e gere um exemplo de arquivo xml como no URL sugerido.
2. No "XML Schema Explorer", role até o fim para encontrar o nó raiz / dados. Clique com o botão direito do mouse no nó raiz / dados e ele mostrará "Gerar XML de Amostra". Se não aparecer, significa que você não está no nó do elemento de dados, mas em qualquer um dos nós de definição de dados.
O xsd.exe não funciona bem quando você tem referências circulares (ou seja, um tipo pode possuir um elemento de seu próprio tipo direta ou indiretamente).
Quando existem referências circulares, eu uso o Xsd2Code. O Xsd2Code lida bem com referências circulares e funciona no VS IDE, o que é uma grande vantagem. Ele também possui muitos recursos que você pode usar como gerar o código de serialização / desserialização. Certifique-se de ativar os atributos GenerateXMLAt se estiver gerando serialização (caso contrário, você obterá exceções para pedidos, se não definidas em todos os elementos).
Nem funciona bem com o recurso de escolha. você terminará com listas / coleções de objetos em vez do tipo que deseja. Eu recomendo evitar a escolha no seu xsd, se possível, pois isso não serializa / desserializa bem em uma classe fortemente tipada. Se você não se importa com isso, porém, não há problema.
O recurso any no xsd2code desserializa como System.Xml.XmlElement, o que eu acho realmente conveniente, mas pode ser um problema se você quiser objetos com tipos fortes. Eu costumo usar qualquer um deles ao permitir dados de configuração personalizados, portanto, um XmlElement é conveniente para passar para outro desserializador XML personalizado definido em outro local.
Para uma solução rápida e preguiçosa (e sem usar o VS), tente estes conversores online:
XSD => XML => classes C #
Exemplo 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>
Converte em 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>
O que é convertido nessa estrutura de classes:
/*
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; }
}
}
Atenção! Leve em conta que isso é apenas para começar, os resultados obviamente precisam de aprimoramentos!
Eu uso XSD
em um script em lote para gerar .xsd
arquivos e classes XML
diretamente:
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%
Eu usei xsd.exe
no prompt de comando do Windows.
No entanto, como meu xml referenciou vários xmls on-line (no meu caso, http://www.w3.org/1999/xlink.xsd
quais referências http://www.w3.org/2001/xml.xsd
) eu também precisei baixar esses esquemas, colocá-los no mesmo diretório que meu xsd e listar esses arquivos no comando:
"C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / idioma: CS your.xsd xlink.xsd xml.xsd
xsd.exe
porque não gosta de referências circulares, mas no final fui bem-sucedida.
Junto com o WSDL, eu tinha arquivos xsd. O exemplo acima não funcionou no meu caso deu erro. Funcionou da seguinte maneira
wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl
D:\CXTypes.xsd D:\CTypes.xsd
D:\Preferences.xsd