Como gerar classes .NET 4.0 a partir do xsd?

317

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?

Bastien Vandamme
fonte
@drzaus Eu tive esse trabalho no passado, mas agora, quando adiciono um, gera como uma classe DataSet em vez das classes que eu esperaria. Acabei de adicionar um item existente e selecione o arquivo XSD.
msmucker0527

Respostas:

490

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, /enableDataBindingpode ser útil.

Marc Gravell
fonte
83
"C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / idioma: CS your.xsd
GeorgesC
2
Gravell para o resgate novamente! Embora essa resposta seja 100% correta, no meu caso, achei mais fácil adicionar o caminho do diretório xsd.exe à variável de ambiente PATH. Meu computador -> propriedades -> avançado -> variáveis ​​de ambiente -> Caminho - e adicione "C: \ Arquivos de Programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" (é claro preste muita atenção às versões Windows e .NET específicas para sua máquina) - codificação feliz!
Pimbrouwers 09/07/19
15
Para o caso, você tem várias definições de esquema interligadas, apenas nomeie todas elas. xsd schema1.xsd schema2.xsd schema3.xsd /c
Mivra # 24/16
56

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)

Serge Wautier
fonte
10
Não consegui que o xsd2code funcionasse para mim. O xsd.exe é mais robusto, mas enfrenta esquemas que possuem grupos "circulares".
Jeff
O xsd2code funciona no visual studio 2017 e era exatamente o que eu estava procurando. você deve executá-lo primeiro no diretório de arquivos do programa (x86) e depois usar o instalador do vsix. então funciona muito bem. era MUITO SUPERIOUR para o xsd.exe que gerava matrizes [] [] em vez de lists.i tinha um .xsd gigante e preciso criar classes para serializar o XML. xsd.exe não iria gerar código serializado (core .net 2) e xsd2code funcionou muito bem
hanzolo
A versão atualizada do XSD2CODE para Visual Studio 2015 e 2017 está aqui: marketplace.visualstudio.com/…
Gianpiero
O xsd2code original agora é xsd2code ++. A edição da comunidade está disponível no VS Marketplace
Gerd K
17

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.

  1. Depois de abrir o xsd no modo de exibição de design, como abaixo, clique em xml schema explorer insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

  1. Copie o Xml gerado para a área de transferência
  2. Crie uma nova classe vazia em sua solução e exclua a definição de classe. Somente o namespace deve permanecer
  3. Enquanto o ponteiro do mouse estiver focado dentro da sua classe, escolha EDIT-> Colar Especial-> Colar Xml como Classes
batmaci
fonte
Infelizmente, isso não é garantido para gerar todas as classes, mas é um truque COOL.
John Zabroski 23/01
1
@JohnZabroski você teve algum caso em que não funcionou para você? Depende da amostra xml, se você pode criar amostra xml com todas as classes e membros, não há motivo para perder nenhuma classe e membro.
batmaci 23/01
Meu ponto é o passo 2 não é garantido que funcione. Mas é um truque legal.
John Zabroski 23/01
Resposta maravilhosa. Você merece algumas cervejas geladas !!
HenryGuillen17
14

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.

VoteCoffee
fonte
Adicionei xsd2code olhando para sua resposta. Precisamos mudar alguma coisa para que ele cuide das referências circulares do grupo? Ele não está trabalhando para mim com propriedades padrão
Jyotsna Sonawane
Não precisei fazer nada de especial para trabalhar com referências circulares. Se você postar o xml como uma nova pergunta e adicionar um link aqui, fico feliz em dar uma olhada nele.
precisa saber é o seguinte
10

Para uma solução rápida e preguiçosa (e sem usar o VS), tente estes conversores online:

  • conversor xsd para xml aqui
  • conversor xmltocsharp aqui

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!

cnom
fonte
Muito obrigado. Isso pode ser usado como um bom exemplo para quem está aprendendo XML Schema e XML no .NET
theeranitp 23/01
Resposta maravilhosa. Você merece algumas cervejas geladas!
HenryGuillen17
5

Eu uso XSDem um script em lote para gerar .xsdarquivos e classes XMLdiretamente:

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
fonte
2

O comando que funcionou no meu caso foi:

xsd /c your.xsd 
Melchia
fonte
1

A resposta de Marc Gravells foi certa para mim, mas meu xsd estava com a extensão .xml. Quando eu usei o programa xsd, ele dava:
- The table (Amt) cannot be the child table to itself in nested relations.

De acordo com este KB325695 , renomei a extensão de .xml para .xsd e funcionou bem.

Igoris Azanovas
fonte
1

Eu usei xsd.exeno 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.xsdquais 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

Aske B.
fonte
Esse não seria o XSD do mercado da Amazon, onde você criaria aulas por enquanto :-) Eu tive que trabalhar com eles uma vez, nunca mais tocarei neles ou faria qualquer trabalho em C # usando arquivos XSD da amazon. essa bagunça é irreal.
quer
@shawty Eu estava trabalhando com os padrões GIS - WFS e WMS - que são definidos por XSDs grandes e com referências cruzadas. Foi uma grande bagunça xsd.exeporque não gosta de referências circulares, mas no final fui bem-sucedida.
Aske B.
sim, esse teria sido meu segundo palpite. Visto os demais, ao melhor não onde perto tão ruim quanto o material Amazonas embora ... me dá pesadelos lembrando tremores
shawty
0

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 
Hamit YILDIRIM
fonte