it-swarm.com.ru

Как создать классы .NET 4.0 из xsd?

Какие есть варианты для создания классов (сущностей) .NET 4.0 c # из файла xsd с использованием Visual Studio 2010?

263
Bastien Vandamme

достаточно просто; просто запустите (в командной строке vs)

xsd your.xsd /classes

(который создаст your.cs). Обратите внимание, однако, что большинство встроенных опций не сильно изменились с 2.0

Для параметров используйте xsd /? или см. MSDN ; например, /enableDataBinding может быть полезен.

428
Marc Gravell

xsd.exe, как упомянуто Марком Гравеллом. Самый быстрый способ запустить IMO.

Или если вам нужно больше гибкости/вариантов:

xsd2code надстройка VS (Codeplex)

53
Serge Wautier

xsd.exe плохо работает, когда у вас есть циклические ссылки (т. е. тип может иметь элемент своего типа прямо или косвенно).

Когда существуют циклические ссылки, я использую Xsd2Code. Xsd2Code хорошо обрабатывает циклические ссылки и работает в VS IDE, что является большим плюсом. Он также имеет множество функций, которые вы можете использовать, например, создание кода сериализации/десериализации. Убедитесь, что вы включили GenerateXMLAttributes, если вы генерируете сериализацию (в противном случае вы получите исключения для упорядочивания, если они не определены для всех элементов).

Ни то, ни другое не работает с функцией выбора. в итоге вы получите списки/коллекции объектов, а не того типа, который вам нужен. Я бы порекомендовал избегать выбора в вашем xsd, если это возможно, так как это плохо сериализует/десериализует в строго типизированный класс. Если вас это не волнует, тогда это не проблема.

Любая функция в xsd2code десериализуется как System.Xml.XmlElement, что я считаю действительно удобным, но может быть проблемой, если вы хотите строго типизированные объекты. Я часто использую любой, когда разрешаю настраиваемые данные конфигурации, поэтому XmlElement удобно передавать в другой десериализатор XML, который определен в другом месте.

14
VoteCoffee

Я использую XSD в пакетном скрипте для генерации файла .xsd и классов из XML напрямую: 

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%
3
hdoghmen

Ответ Марка Гравелса был верным для меня, но мой xsd был с расширением .xml. Когда я использовал программу xsd, это дало:
- The table (Amt) cannot be the child table to itself in nested relations.

В соответствии с этим KB325695 я переименовал расширение из .xml в .xsd, и оно работало нормально.

1
Igoris Azanovas

Команда, которая работала в моем случае, была:

xsd /c your.xsd 
0
Melchia

Я использовал xsd.exe в командной строке Windows.

Однако, поскольку мой xml ссылался на несколько онлайновых xml (в моем случае http://www.w3.org/1999/xlink.xsd, который ссылается на http://www.w3.org/2001/xml.xsd), мне пришлось также загрузить эти схемы, поместить их в тот же каталог, что и мой xsd, и затем перечислить эти файлы в команде:

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

0
Aske B.

Для быстрого и ленивого решения, (и вообще не использующего VS), попробуйте эти онлайн-конвертеры:

XSD => XML => C # классы

Пример 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>

Преобразует в 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>

Который преобразует в эту структуру класса:

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

}

Внимание! Примите во внимание, что это только для начала, результаты очевидно нуждаются в уточнении!

0
cnom