如何从xsd生成。net 4.0类?

使用Visual Studio 2010从xsd文件生成。net 4.0 c#类(实体)有哪些选项?

438797 次浏览

很简单;只需运行(在vs命令提示符下)

xsd your.xsd /classes

(这将创建your.cs)。但是请注意,自2.0以来,这里的大部分固有选项都没有太大变化

对于选项,使用xsd /?看到MSDN;例如/enableDataBinding是有用的。

xsd.exe, Marc Gravell提到过。在我看来,这是最快的启动和运行方式。

或者如果你需要更多的灵活性/选择:

xsd2code VS插件(Codeplex)

当您使用循环引用(即类型可以直接或间接拥有自己类型的元素)时,Xsd.exe不能很好地工作。

当存在循环引用时,我使用Xsd2Code。Xsd2Code可以很好地处理循环引用,并且可以在VS IDE中工作,这是一个很大的优点。它还有许多您可以使用的特性,比如生成序列化/反序列化代码。但是,如果您正在生成序列化,请确保您打开GenerateXMLAttributes(否则,如果没有在所有元素上定义,则会出现排序异常)。

两者都不适合选择功能。你最终得到的是object的列表/集合,而不是你想要的类型。我建议尽可能避免在xsd中进行选择,因为这不能很好地序列化/反序列化到强类型类中。如果你不关心这个,那就不是问题。

xsd2code中的any特性反序列化为System.Xml.XmlElement,我发现这非常方便,但如果您想要强类型对象,这可能是一个问题。当允许自定义配置数据时,我经常使用any,这样XmlElement可以方便地传递给在其他地方自定义的另一个XML反序列化器。

我在批处理脚本中使用XSD直接从XML生成.xsd文件和类:

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%
Marc Gravells的答案对我来说是正确的,但我的xsd扩展了.xml。当我使用xsd程序时,它给出:
- The table (Amt) cannot be the child table to itself in nested relations. < / p >

根据这个KB325695,我将扩展名从.xml重命名为.xsd,它工作得很好。

我在Windows命令提示符中使用了xsd.exe

然而,由于我的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. exexsd xlink。xsd xml.xsd

对于快速和懒惰的解决方案,(并且根本不使用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 /c your.xsd

除了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
我在这里向你展示了使用Vs2017和Vs2019的最简单的方法 用Visual Studio打开xsd,并生成一个示例xml文件,如url所建议的那样
    在设计视图中打开xsd后,单击xml模式资源管理器 李enter image description here < / >
< p > 2。 在“XML Schema Explorer”中向下滚动以找到根/数据节点。右键单击根/数据节点,它将显示“生成示例XML”。如果没有显示,则意味着您不在数据元素节点上,而是在任何数据定义节点上

enter image description here

  1. 将生成的Xml复制到剪贴板中
  2. 在解决方案中创建一个新的空类并删除类定义。只保留Namespace
  3. 当您的鼠标指针聚焦在类内部时,选择编辑->粘贴特殊->粘贴Xml作为类
如果你想生成具有自动属性的类,使用将XSD转换为XML,然后使用将XML转换为JSON,并复制到剪贴板的结果。 然后在VS中,在你要创建类的文件中,点击Edit>Paste Special>Paste JSON as classes.