Які варіанти для створення .NET 4.0 c # класів (сутностей) з файлу xsd, використовуючи Visual Studio 2010?
Які варіанти для створення .NET 4.0 c # класів (сутностей) з файлу xsd, використовуючи Visual Studio 2010?
Відповіді:
досить простий; просто запустіть (у командному рядку vs)
xsd your.xsd /classes
(що створить your.cs
). Зауважте, що більшість внутрішніх параметрів тут не змінилися значно з 2.0
Для параметрів використовуйте xsd /?
або див. MSDN ; наприклад, /enableDataBinding
може бути корисним.
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe, як згадував Марк Гравелл. Найшвидший спосіб піднятися та запустити IMO.
Або якщо вам потрібна більша гнучкість / варіанти:
надбудова xsd2code VS (Codeplex)
Я показую вам найпростіший спосіб за допомогою Vs2017 та Vs2019 Відкрийте свій xsd за допомогою Visual Studio та генеруйте зразок xml-файлу, як у запропонованому URL- адресі.
2. У програмі "XML Schema Explorer" прокрутіть увесь шлях вниз, щоб знайти кореневий / вузол даних. Клацніть правою кнопкою миші на корінь / вузол даних, і він покаже "Створення зразка XML". Якщо він не відображається, це означає, що ви не знаходитесь у вузлі елемента даних, але ви перебуваєте на будь-якому з вузлів визначення даних.
xsd.exe не працює добре, якщо у вас кругові посилання (тобто тип може володіти елементом власного типу прямо або опосередковано).
Коли існують кругові посилання, я використовую Xsd2Code. Xsd2Code добре обробляє циркулярні посилання та працює у VS IDE, що є великим плюсом. Він також має безліч функцій, якими ви можете скористатися, наприклад, генеруючи код серіалізації / десеріалізації. Не забудьте увімкнути GenerateXMLAttributes, якщо ви генеруєте серіалізацію (інакше ви отримаєте винятки для замовлення, якщо вони не визначені для всіх елементів).
Жодна з функцій вибору не працює добре. ви отримаєте списки / колекції об'єкта замість потрібного типу. Я рекомендую уникати вибору у вашому xsd, якщо це можливо, оскільки це не серіалізує / дееріалізує добре в сильно набраний клас. Якщо вам це не байдуже, то це не проблема.
Будь-яка особливість у xsd2code десяріалізується як System.Xml.XmlElement, що мені здається дуже зручним, але це може бути проблемою, якщо ви хочете сильних набраних об'єктів. Я часто використовую будь-які, коли дозволяють користувальницькі конфігураційні дані, тому XmlElement зручно переходити на інший десеріалізатор XML, який визначений у інших місцях.
Для швидкого і ледачого рішення (і зовсім не використовуйте 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; }
}
}
Увага! Враховуйте, що це лише для початку роботи, результати очевидно потребують уточнення!
Я використовую 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%
Відповідь Марка Гравеллса була правильною для мене, але мій xsd був із розширенням .xml. Коли я користувався програмою xsd, вона давала:
- The table (Amt) cannot be the child table to itself in nested relations.
Відповідно до цього KB325695 я перейменував розширення з .xml на .xsd, і він працював чудово.
Я використовував 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
xsd.exe
тому що це не любить кругових посилань, але в результаті я досяг успіху.
Поряд із 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