如何从xsd生成.NET 4.0类?


317

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


@drzaus我过去曾做过这项工作,但是现在当我添加它时,它会作为DataSet类而不是我期望的类生成。我只添加一个现有项目并选择XSD文件。
msmucker0527 '02

Answers:


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 Tools \ xsd.exe” / classes / language:CS your.xsd
GeorgesC

2
再次紧急救援!尽管此答案是100%正确的,但以我为例,我发现将xsd.exe目录路径添加到PATH环境变量中是最简单的。我的电脑->属性->高级->环境变量->路径-并添加“ C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \”(当然请密切注意特定于您计算机的Windows和.NET版本)-编码愉快!
pimbrouwers

15
对于这种情况,您有几个相互关联的架构定义,只需将它们全部命名即可。 xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

Mars Gravell提到的xsd.exe。建立和运行IMO的最快方法。

或者,如果您需要更多的灵活性/选项:

xsd2code VS加载项(Codeplex)


10
我根本无法让xsd2code为我工作。xsd.exe更加健壮,但是在具有“圆形”组的架构中苦苦挣扎。
Jeff

xsd2code可在Visual Studio 2017中使用,而这正是我一直在寻找的东西。您必须先在程序文件(x86)目录中运行它,然后使用vsix安装程序。那么效果很好。xsd.exe的超级优势是生成了arrays [] []而不是lists。我有一个巨大的.xsd,我需要创建类来将XML序列化为。xsd.exe不会生成可序列化的代码(.net核心2),并且xsd2code效果很好
hanzolo

Visual Studio 2015 e 2017的XSD2CODE的更新版本在这里:marketplace.visualstudio.com/…–
Gianpiero

原来的xsd2code现在是xsd2code ++。社区版可在VS Marketplace上获得
Gerd K

17

我在这里向您展示了使用Vs2017和Vs2019的最简单方法,使用Visual Studio打开xsd并生成一个示例xml文件,如建议的url中所示

  1. 如下所示在设计视图中打开xsd后,单击xml模式资源管理器 在此处输入图片说明

2.在“ XML Schema Explorer”中,一直向下滚动以找到根/数据节点。右键单击根/数据节点,它将显示“ Generate Sample XML”。如果未显示,则表示您不在数据元素节点上,但在任何数据定义节点上。

在此处输入图片说明

  1. 将生成的Xml复制到剪贴板
  2. 在您的解决方案中创建一个新的空类,然后删除类定义。仅名称空间应保留
  3. 当鼠标指针集中在类内部时,选择 EDIT-> Paste Special-> Paste Xml作为类

不幸的是,不能保证会生成所有类,但这是一个绝妙的技巧。
John Zabroski

1
@JohnZabroski您是否有没有对您有用的案例?这取决于示例xml,如果可以使用所有类和成员创建示例xml,则没有理由错过任何类和成员。
batmaci

我的观点是步骤2不能保证正常工作。但这是一个很酷的把戏。
John Zabroski

很棒的答案。您应该得到一些冰镇啤酒!
HenryGuillen17

14

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

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

两者都不适合使用选择功能。您最终将得到对象的列表/集合,而不是所需的类型。如果可能,我建议避免在xsd中进行选择,因为这样做不会很好地序列化/反序列化为强类型类。但是,如果您对此不关心,那么这不是问题。

xsd2code中的any功能反序列化为System.Xml.XmlElement,我觉得这很方便,但如果要使用强类型对象,则可能会遇到问题。在允许自定义配置数据时,我经常使用any,因此XmlElement可以方便地传递到其他地方自定义定义的另一个XML反序列化器。


我通过查看您的答案添加了xsd2code。我们是否需要更改任何内容以处理循环组引用?它不适用于默认属性
Jyotsna Sonawane

使用循环引用时,我不必做任何特殊的事情。如果您将xml作为新问题发布并在此处添加链接,我很乐意进行查看。
VoteCoffee,2015年

10

对于快速懒惰的解决方案,(并且根本不使用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; }
    }

}

注意!考虑到这只是“入门”,结果显然需要改进!


非常感谢。对于正在学习.NET中的XML Schema和XML的人来说,这可以作为一个很好的例子
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%

2

在我的情况下有效的命令是:

xsd /c your.xsd 

1

Marc Gravells的答案很适合我,但我的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:\ 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的所在,现在您将在这里建立类:-)我不得不与他们合作一次,我再也不会接触它们或使用亚马逊XSD文件在C#中做任何工作,如此混乱,这是不真实的。
shawty

@shawty我正在使用GIS标准-WFS和WMS-由大型,圆形交叉引用的XSD定义。xsd.exe因为它不喜欢循环引用,所以很麻烦,但是最后我成功了。
Aske B.

是的,那是我的第二个猜测。也看到了那些东西,虽然没有哪
件事

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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.