c# - visual - xsd run




Como gerar classes do.NET 4.0 a partir do xsd? (6)

Quais são as opções para gerar classes c # .NET 4.0 (entidades) de um arquivo xsd, usando o Visual Studio 2010?


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

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


Eu usei xsd.exe no prompt de comando do Windows.

No entanto, uma vez que o meu xml referenciava vários xml online (no meu caso http://www.w3.org/1999/xlink.xsd que referencia http://www.w3.org/2001/xml.xsd ) eu tive que também faça o download desses esquemas, coloque-os no mesmo diretório do meu xsd e liste esses arquivos no comando:

"C: \ Arquivos de Programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Ferramentas \ xsd.exe" / classes / language: CS seu.xsd xlink.xsd xml.xsd


O comando que funcionou no meu caso foi:

xsd /c your.xsd 

Para uma solução rápida e preguiçosa , (e não usando o VS) tente estes conversores on-line:

  • xsd-to-xml-converter here
  • conversor xmltocsharp here

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 para 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 converte para esta 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 isto é apenas para Get-You-Started, os resultados obviamente precisam de refinamentos!


xsd.exe como mencionado por Marc Gravell. A maneira mais rápida de se levantar e executar o IMO.

Ou se você precisar de mais flexibilidade / opções:

Suplemento VS xsd2code (Codeplex)


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 Xsd2Code. O Xsd2Code trata bem as referências circulares e trabalha dentro do 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 o GenerateXMLAttributes se estiver gerando serialização (caso contrário, você obterá exceções para o pedido, se não definido 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 você quer. Eu recomendaria evitar a escolha em 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, então, não é um problema.

O recurso qualquer em xsd2code desserializa como System.Xml.XmlElement que considero muito conveniente, mas pode ser um problema se você quiser objetos digitados fortes. Costumo usar qualquer um ao permitir dados de configuração personalizados, portanto é conveniente passar um XmlElement para outro deserializador de XML que é personalizado em outro lugar.





xsd