Як генерувати .NET 4.0 класи з xsd?


317

Які варіанти для створення .NET 4.0 c # класів (сутностей) з файлу xsd, використовуючи Visual Studio 2010?


@drzaus У мене була ця робота в минулому, але тепер, коли я додаю її, вона створюється як клас DataSet замість класів, які я б очікував. Я просто додаю існуючий елемент і вибираю файл XSD.
msmucker0527

Відповіді:


490

досить простий; просто запустіть (у командному рядку vs)

xsd your.xsd /classes

(що створить your.cs). Зауважте, що більшість внутрішніх параметрів тут не змінилися значно з 2.0

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


83
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Інструменти \ xsd.exe" / класи / мова: CS your.xsd
GeorgesC

2
Гравелл знову на допомогу! Хоча ця відповідь на 100% вірна, в моєму випадку я вважаю, що найпростіше додати шлях до каталогу каталогу xsd.exe до змінної середовища PATH. Мій комп'ютер -> властивості -> розширені -> змінні середовища -> Шлях - і додайте "C: \ програмні файли (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Інструменти \" (звичайно зверніть пильну увагу як на Windows, так і на .NET версії, характерні для вашої машини) - щасливе кодування!
pimbrouwers

15
У випадку, якщо у вас є кілька визначень схеми взаємопов'язаних, просто назвіть їх усі. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

xsd.exe, як згадував Марк Гравелл. Найшвидший спосіб піднятися та запустити IMO.

Або якщо вам потрібна більша гнучкість / варіанти:

надбудова xsd2code VS (Codeplex)


10
Я не міг змусити xsd2code працювати на мене взагалі. xsd.exe більш надійний, але бореться зі схемами, які мають "кругові" групи.
Джефф

xsd2code працює у візуальній студії 2017 року і саме це я шукав. спочатку потрібно запустити його в каталозі програмних файлів (x86), а потім скористатися програмою встановлення vsix. то це чудово працює. це було ДУШЕ НАДЗВИТОК для xsd.exe, який генерував масиви [] [] замість list.i мав гігантський .xsd, і мені потрібно створити класи для серіалізації XML у. xsd.exe не генерує серіалізаційний код (.net core 2), і xsd2code спрацював чудово
hanzolo

Оновлена ​​версія XSD2CODE для Visual Studio 2015 e 2017 знаходиться тут: marketplace.visualstudio.com/…
Gianpiero

Оригінальний код xsd2 тепер xsd2code ++. Видання для спільноти доступне на VS Marketplace
Gerd K

17

Я показую вам найпростіший спосіб за допомогою Vs2017 та Vs2019 Відкрийте свій xsd за допомогою Visual Studio та генеруйте зразок xml-файлу, як у запропонованому URL- адресі.

  1. Як тільки ви відкрили свій xsd у дизайнерському поданні, як показано нижче, натисніть на XML-схему провідника введіть тут опис зображення

2. У програмі "XML Schema Explorer" прокрутіть увесь шлях вниз, щоб знайти кореневий / вузол даних. Клацніть правою кнопкою миші на корінь / вузол даних, і він покаже "Створення зразка XML". Якщо він не відображається, це означає, що ви не знаходитесь у вузлі елемента даних, але ви перебуваєте на будь-якому з вузлів визначення даних.

введіть тут опис зображення

  1. Скопіюйте створений Xml у буфер обміну
  2. Створіть у своєму рішенні новий порожній клас та видаліть визначення класу. Залишається лише простір імен
  3. Поки вказівник миші зосереджений у вашому класі, оберіть EDIT-> Paste Special-> Paste Xml як Class

Це, на жаль, не гарантує створення всіх класів, але це хитрість COOL.
Іван Заброський

1
@JohnZabroski У вас був випадок, що це не працювало для вас? Це залежить від зразка xml, якщо ви можете створити зразок xml з усіма класами та членами, немає причин пропускати будь-який клас та член.
batmaci

Моя думка - крок 2 - це гарантовано не працює. Але це хитрість COOL.
Іван Заброський

Чудова відповідь. Ви заслуговуєте на холодне пиво !!
HenryGuillen17

14

xsd.exe не працює добре, якщо у вас кругові посилання (тобто тип може володіти елементом власного типу прямо або опосередковано).

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

Жодна з функцій вибору не працює добре. ви отримаєте списки / колекції об'єкта замість потрібного типу. Я рекомендую уникати вибору у вашому xsd, якщо це можливо, оскільки це не серіалізує / дееріалізує добре в сильно набраний клас. Якщо вам це не байдуже, то це не проблема.

Будь-яка особливість у xsd2code десяріалізується як System.Xml.XmlElement, що мені здається дуже зручним, але це може бути проблемою, якщо ви хочете сильних набраних об'єктів. Я часто використовую будь-які, коли дозволяють користувальницькі конфігураційні дані, тому XmlElement зручно переходити на інший десеріалізатор XML, який визначений у інших місцях.


Я додав код xsd2, дивлячись на вашу відповідь. Чи потрібно щось міняти для того, щоб подбати про кругові групові посилання? Це не працює для мене з властивостями за замовчуванням
Jyotsna Sonawane

Мені не потрібно було робити нічого особливого для роботи з циркулярними посиланнями. Якщо ви опублікуєте xml як нове запитання та додасте посилання тут, я з радістю перегляну його.
VoteCoffee

10

Для швидкого і ледачого рішення (і зовсім не використовуйте VS) спробуйте такі онлайн-перетворювачі:

  • тут перетворювач xsd-to-xml
  • xmltocsharp конвертер тут

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

}

Увага! Враховуйте, що це лише для початку роботи, результати очевидно потребують уточнення!


Дуже дякую. Це може бути корисним прикладом для тих, хто вивчає XML-схему та XML в .NET
theeranitp

Чудова відповідь. Ви заслуговуєте на холодне пиво!
HenryGuillen17

5

Я використовую 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

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

Відповідно до цього KB325695 я перейменував розширення з .xml на .xsd, і він працював чудово.


1

Я використовував xsd.exeу командному рядку Windows.

Однак, оскільки мій xml посилався на декілька онлайн- файлів xml (у моєму випадку на http://www.w3.org/1999/xlink.xsdякі посилання http://www.w3.org/2001/xml.xsd), я повинен був також завантажити ці схеми, помістити їх у ту саму директорію, що і мій xsd, а потім перерахувати ці файли в команді:

"C: \ програмні файли (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Інструменти \ xsd.exe" / класи / мова: CS your.xsd xlink.xsd xml.xsd


Це не сталося б на ринку Amazon XSD, де зараз будують класи :-) Мені довелося працювати з ними один раз, більше ніколи не зачіпатиму їх і не виконувати будь-яку роботу в C #, використовуючи файли XSD Amazons, є такий безлад нереальний.
shawty

@shawty Я працював зі стандартами ГІС - WFS та WMS - які визначаються великими круговими перехресними посиланнями XSD. Це було великим безладом, xsd.exeтому що це не любить кругових посилань, але в результаті я досяг успіху.
Aske B.

так, це була б моя друга здогадка. Побачивши їх, їх немає там, де поруч так само погано, як амазонські речі, хоча ... дає мені кошмари, пригадуючи здригання
shawty

0

Поряд із WSDL у мене були файли xsd. Вищезгадане не спрацювало, в моєму випадку дало помилку. Працювало так

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.