Какие есть варианты для создания классов (сущностей) .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» прокрутите весь путь вниз, чтобы найти корневой узел / узел данных. Щелкните правой кнопкой мыши по корневому узлу / узлу данных, и он покажет «Generate Sample 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: \ 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
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