c# - 使用 xsd.exe 从架构生成的类不包含枚举值
问题描述
我有一个 XSD 文件,它保存 XML 文件中某些元素的值。我想编写一个程序,从这个 XSD 文件中提取这些值,这样我就可以从所述元素的所有值中创建一个下拉菜单。
这是我的 XSD 文件,我想在其中使用它在我的应用程序中提供的每个值:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="POSSimpleTypes.xsd"/>
<xs:complexType name="PRODUCT_STOPType">
<xs:annotation>
<xs:documentation>Version 1.11</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="CRUD">
<xs:simpleType>
<xs:restriction base="CRUDType">
<xs:enumeration value="P"/>
<xs:enumeration value="C"/>
<xs:enumeration value="U"/>
<xs:enumeration value="D"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="SKU_CODE">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="SKUType">
<xs:attribute name="owner" type="CODEType" use="optional"/>
<xs:attribute name="owner_type" use="optional">
<xs:simpleType>
<xs:restriction base="CONSTANTType">
<xs:enumeration value="1"/>
<xs:enumeration value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="STOP_REASON">
<xs:simpleType>
<xs:restriction base="CONSTANTType">
<xs:enumeration value="21001"/>
<xs:enumeration value="21002"/>
<xs:enumeration value="21003"/>
<xs:enumeration value="21004"/>
<xs:enumeration value="21005"/>
<xs:enumeration value="21006"/>
<xs:enumeration value="21007"/>
<xs:enumeration value="21008"/>
<xs:enumeration value="21009"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LOGIN_NAME" type="NAMEType"/>
<xs:element name="PROD_STOP_COMMENCE" type="DATEType" minOccurs="0"/>
<xs:element name="PROD_STOP_END" type="DATEType" minOccurs="0"/>
<xs:element name="CODE" type="LONG_CODEType" minOccurs="0"/>
<xs:element name="ORG_UNITS">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="ORGU_CODE">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="CODEType">
<xs:attribute name="type" type="NAMEType" use="required"/>
<xs:attribute name="parent" type="CODEType" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="docNo" type="INTEGERType" use="required"/>
</xs:complexType>
<xs:element name="PRODUCT_STOPType" type="PRODUCT_STOPType" />
</xs:schema>
当我在 Visual Studio 中运行开发人员命令提示符并将文件转换为类时,生成的文件如下所示:
public int STOP_REASON {
get {
return this.sTOP_REASONField;
}
set {
this.sTOP_REASONField = value;
}
}
XSD 文件中列出的值在哪里以及如何检索它们?
谢谢。
解决方案
我想,我关于 xsd 工具只为xs:string
类型上定义的枚举值生成枚举的假设是正确的。我尝试了以下简单的 xml 架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="MyClass">
<xs:complexType>
<xs:sequence>
<xs:element name="MyStringEnum">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Val1" />
<xs:enumeration value="Val2" />
<xs:enumeration value="Val3" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="MyIntEnum">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:enumeration value="2" />
<xs:enumeration value="4" />
<xs:enumeration value="6" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对此运行 xsd 工具,将生成以下类:
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class MyClass {
private MyClassMyStringEnum myStringEnumField;
private int myIntEnumField;
/// <remarks/>
public MyClassMyStringEnum MyStringEnum {
get {
return this.myStringEnumField;
}
set {
this.myStringEnumField = value;
}
}
/// <remarks/>
public int MyIntEnum {
get {
return this.myIntEnumField;
}
set {
this.myIntEnumField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
public enum MyClassMyStringEnum {
/// <remarks/>
Val1,
/// <remarks/>
Val2,
/// <remarks/>
Val3,
}
如您所见,生成enum
了xs:string
基于成员的 ,而xs:int
基于成员仅创建为 int 类型。我仍在寻找文档来确认这一点,但测试结果不言自明。
推荐阅读
- react-redux - 在哪里使用 React 中的 Hooks 定义需要来自全局状态的数据的套接字事件侦听器
- c - 我想使用 sigaction(),但我有问题
- blazor - Blazor:直接将类绑定到输入元素
- performance - 如何对结构进行 GROUP BY 操作
- ios - App Store Connect 操作错误。无效的图像路径。未找到图片
- python - 返回 None 类型列表而不是什么的函数
- node.js - aws-api-gateway-client API POST 方法问题
- directory - 在 Markdown 语法中表示目录和文件结构时,哪种语言适合防护代码块?
- powershell - 如何安排 powershell 脚本从 00:00:30 到 11:59:59 运行,然后在第二天 00:00:30 再次运行
- c++ - 当输入有大量数据时,for循环进行了超长时间(20+分钟)迭代