如何从一个类创建XSD模式?

60

我在处理XSD文件方面遇到了困难。

我正在尝试从一个类创建XSD文件:

public enum Levels { Easy, Medium, Hard }
public sealed class Configuration
{
    public string Name { get;set; }
    public Levels Level { get; set; }
    public ConfigurationSpec { get;set;}
}

public abstract class ConfigurationSpec { }
public class ConfigurationSpec1
{
    // ...
}
public class ConfigurationSpec2
{
    // ...
}
请注意,我在Configuration中有一个抽象类。有了这个特性,是否可以创建XSD,如果可能的话,如何创建?
想法是将Configuration类传递给XSD。

你可以使用免费的XML模式定义工具(Xsd.exe) - Todd Hilehoffer
2个回答

101

你可以按如下方式将xsd.exe成功集成到Visual Studio IDE中:

进入 工具,外部工具并点击 添加 按钮:

2010

enter image description here

2015 / 2017

enter image description here

标题:

从类创建模式

命令(每个框架):

4.0

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\xsd.exe

4.5.1

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\xsd.exe

4.6.*

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.* Tools\x64\xsd.exe

参数:

$(BinDir)$(TargetName).dll /outputdir:$(ItemDir) /type:$(ItemFileName)

使用输出窗口:

防止弹出额外的命令窗口,并保留输出记录,直到您清除它。这可能是个好主意。

提示输入参数:

如果您想测试输出或进行故障排除,则勾选;否则,请取消勾选。

点击 确定

如何使用:

  1. 编译你的项目! XSD.exe只看已编译的代码。
  2. Solution Explorer中点击类。
  3. 点击工具,从类创建模式
  4. Solution Explorer中点击显示所有文件按钮。
  5. 在与你的类相同的文件夹中找到Schema0.xsd
  6. 右键单击Schema0.xsd并选择包括在项目中
  7. Schema0.xsd重命名为<类的名称>.xsd
  8. (可选) 如果要使用此模式在xml编辑器中编辑xml文件并且您没有使用所有属性,则可能需要手动编辑此新的xsd。您可以将use="required"替换为use="optional"以消除xml编辑器中的蓝色波浪线(会产生警告),如果实际上这些属性不是必需的。

4
不要像我一样,在使用时忘了第1步编译。花费了我一些时间才意识到这点。:$ - R. Schreurs
1
@R.Schreurs,强调添加。谢谢! - toddmo
1
@theLaw,不幸的是,xsd.exe没有将其作为命令行参数提供。https://msdn.microsoft.com/zh-cn/library/x6c1kb0s(v=vs.110).aspx?f=255&MSPPError=-2147217396 - toddmo
2
警告:无法生成模式,因为找不到合适的类型。 - Paul McCarthy
如何为多个类生成单独的文件 - Ragavan
显示剩余8条评论

36

你可以使用 XSD.exe(可在 Visual Studio 安装中找到)。

public sealed class Configuration
{
 public string Name { get; set; }
 public Levels Level { get; set; }
 public ConfigurationSpec Spec { get; set; }
}
 public abstract class ConfigurationSpec { }
 public class ConfigurationSpec1    {   }
public class ConfigurationSpec2 {   }

导致

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Levels" type="Levels" />
  <xs:simpleType name="Levels">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Easy" />
      <xs:enumeration value="Medium" />
      <xs:enumeration value="Hard" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Configuration" nillable="true" type="Configuration" />
  <xs:complexType name="Configuration">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="Level" type="Levels" />
      <xs:element minOccurs="0" maxOccurs="1" name="Spec" type="ConfigurationSpec" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ConfigurationSpec" abstract="true" />
  <xs:element name="ConfigurationSpec" nillable="true" type="ConfigurationSpec" />
  <xs:element name="ConfigurationSpec1" nillable="true" type="ConfigurationSpec1" />
  <xs:complexType name="ConfigurationSpec1" />
  <xs:element name="ConfigurationSpec2" nillable="true" type="ConfigurationSpec2" />
  <xs:complexType name="ConfigurationSpec2" />
</xs:schema>

您只需要编译您的汇编语言并使用您汇编文件所在的路径作为参数运行XSD.exeXSD.exe /? 列出了所有参数的列表。

例如:XSD.exe C:\Dev\Project1\Bin\Debug\library.dll


1
你能告诉我你是按照哪些步骤生成的吗? - Darf Zon
2
@DarfZon 尝试将其更改为与您的操作系统相同的架构(x64,x86)。 - Peter
14
如果有人还在疑惑如何选择特定的类来生成 xsd 文件,请输入以下命令:**xsd.exe C:\Dev\Project1\Bin\Debug\library.dll /t:<projectName>.<classNameWithout .cs>**。这应该会从代码中生成一个模式。您可以使用 /out:<location> 命令指定输出位置。 - Brad Germain
7
@BradGermain,应该是 **/t:<完全限定的命名空间>.<不带.cs的类名>**,但感谢你的提示。 - ps2goat
有没有办法在代码中实现这个功能,因为我有一个需要在浏览器中运行但需要生成XSD的项目。 - c-sharp-and-swiftui-devni
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接