Как создать классы .NET 4.0 из xsd? - PullRequest
282 голосов
/ 07 марта 2011

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

Ответы [ 8 ]

449 голосов
/ 07 марта 2011

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

xsd your.xsd /classes

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

.

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

54 голосов
/ 07 марта 2011

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

Или, если вам нужна дополнительная гибкость / опции:

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

14 голосов
/ 03 декабря 2013

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

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

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

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

4 голосов
/ 23 июня 2015

Я использую 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%
1 голос
/ 08 февраля 2019

Для быстрого и ленивого решения , (и вообще без использования 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; }
    }

}

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

1 голос
/ 24 декабря 2015

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

Согласно этому KB325695 Я переименовал расширение из .xml в .xsd, и оно работало нормально.

0 голосов
/ 12 февраля 2019

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

xsd /c your.xsd 
0 голосов
/ 07 августа 2017

Я использовал 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...