enumeration 元素绑定支持

本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.

.NET Framework 为 <enumeration> 元素提供部分绑定支持。

只有当 <enumeration> 方面应用于基于字符串的类型(如 xsd:string)时,Xsd.exe 才将它转换为 .NET Framework enum 定义。

说明

<enumeration> 元素用于基于一个简单数据类型来创建有限的一组选项。使用它,可以通过限制基类型来从现有的简单类型派生新的简单类型。基类型可能已作为枚举创建。

XML 架构规范允许将 <enumeration> 方面应用于 xsd:boolean 以外的任何简单类型。但是,当从 XML 架构文档生成源代码时,Xsd.exe 只能将以基于字符串的简单数据类型(如 xsd:string)为基础的枚举识别为枚举。在这种情况下,转换过程中将生成 enum 定义。

XML 架构定义语言中的下列内置类型翻译为 enum 类型定义:

  • string

  • normalizedString

  • token

  • Name

  • NCName

  • ID

  • ENTITY

  • NMTOKEN

当从一组类生成 XML 架构文档时,Xsd.exe 将 enum 定义翻译为基于 xsd:string 的枚举。

对于其他不是基于字符串的简单类型,Xsd.exe 工具所执行的操作取决于上下文和类型。对于基于内置的数值数据类型的枚举,只要枚举作为元素或特性出现在复杂类型中,转换过程中就会生成一个类型与基类型(例如,对于 xsd:decimal,为 System.Decimal)相对应的字段。否则,当枚举仅仅填充自己的全局定义元素时,该枚举将直接被忽略。

基于字符串的枚举中的值特性

枚举值必须是有效的常数名称,或者是由 Xsd.exe 转换而成的常数名称。下面是枚举值的示例:

<xsd:enumeration value="IRISH CREAM" />

该值转换为下面的 enum 成员:

[System.Xml.Serialization.XmlEnumAttribute("IRISH CREAM")]
IRISHCREAM,

将移除其中的单个空格以生成有效的常数名,并将 XmlEnumAttribute 特性应用于 enum 成员。特性参数将更改用于该 enum 值的 XML 架构枚举值。默认值是 enum 值本身,在本例中为 IRISHCREAM。对于已经是有效常数名称的 XML 架构枚举值,将省略 XmlEnum 特性。

尽管 .NET Framework 不将数值 XSD 枚举转换为 enum 定义,但是它转换值恰好为数字的字符串 XSD 枚举。下面的简单类型定义绑定到 enum 类型,因为它指定 base="xsd:string"

<xsd:simpleType name="Primes">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="2" />
        <xsd:enumeration value="3" />
        <xsd:enumeration value="5" />
        <xsd:enumeration value="7" />
        <xsd:enumeration value="11" />
        <xsd:enumeration value="13" />
        <xsd:enumeration value="17" />
    </xsd:restriction>
</xsd:simpleType>

将生成下面的 enum 类型:

public enum Primes { 
    [System.Xml.Serialization.XmlEnumAttribute("2")]
    Item2,
    [System.Xml.Serialization.XmlEnumAttribute("3")]
    Item3,
    [System.Xml.Serialization.XmlEnumAttribute("5")]
    Item5,
    [System.Xml.Serialization.XmlEnumAttribute("7")]
    Item7,
    [System.Xml.Serialization.XmlEnumAttribute("11")]
    Item11,
    [System.Xml.Serialization.XmlEnumAttribute("13")]
    Item13,
    [System.Xml.Serialization.XmlEnumAttribute("17")]
    Item17,
}

同样,XmlEnum 特性用于重写 xsd:enumeration 值到 XML 架构枚举值的默认绑定。

Example

定义 xsd:stringxsd:int 枚举的输入 XML 架构文档:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
    <xsd:element name="coffeeDrink" type="FancyCoffeeType" />

    <xsd:complexType name="FancyCoffeeType">
        <xsd:attribute ref="selection" use="required" />
        <xsd:attribute ref="shots" use="required" />
    </xsd:complexType>
    
    <xsd:attribute name="selection" type="Flavors"/>
    <xsd:attribute name="shots" type="Primes"/>

    <xsd:simpleType name="Flavors">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="VANILLA" />
            <xsd:enumeration value="HAZELNUT" />
            <xsd:enumeration value="CARAMEL" />
            <xsd:enumeration value="RASPBERRY" />
            <xsd:enumeration value="ALMOND" />
            <xsd:enumeration value="CHERRY" />
            <xsd:enumeration value="IRISH CREAM" />
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="Primes">
        <xsd:restriction base="xsd:int">
            <xsd:enumeration value="2" />
            <xsd:enumeration value="3" />
            <xsd:enumeration value="5" />
            <xsd:enumeration value="7" />
            <xsd:enumeration value="11" />
            <xsd:enumeration value="13" />
            <xsd:enumeration value="17" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

基于前面的 XML 架构文档生成的 C# 类。整数枚举已由 int 类型的字段替换:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("coffeeDrink", Namespace="http://example.org/", IsNullable=false)]
public class FancyCoffeeType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public Flavors selection;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int shots;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum Flavors {
    VANILLA,        
    HAZELNUT,
    CARAMEL,        
    RASPBERRY,
    ALMOND,
    CHERRY,
    System.Xml.Serialization.XmlEnumAttribute("IRISH CREAM")]
    IRISHCREAM,
}

从通过前面的 C# 源代码编译得到的程序集生成的 XML 架构复杂类型和简单类型:

  <xs:complexType name="FancyCoffeeType">
    <xs:attribute name="selection" type="tns:Flavors" />
    <xs:attribute name="shots" type="xs:int" />
  </xs:complexType>
  <xs:simpleType name="Flavors">
    <xs:restriction base="xs:string">
      <xs:enumeration value="VANILLA" />
      <xs:enumeration value="HAZELNUT" />
      <xs:enumeration value="CARAMEL" />
      <xs:enumeration value="RASPBERRY" />
      <xs:enumeration value="ALMOND" />
      <xs:enumeration value="CHERRY" />
      <xs:enumeration value="IRISH CREAM" />
    </xs:restriction>
  </xs:simpleType>

可能的特性 绑定支持

id

Xsd.exe 实用工具会忽略旨在提供唯一标识符的 id 特性。

value

有关 value 特性在以基于字符串的简单数据类型(如 xsd:string)为基础的枚举中的用法,请参见基于字符串的枚举中的值特性。

对于其他所有可枚举的数据类型,将忽略 value 特性。

请参见 value 特性绑定支持 特性。

可能的父元素:<restriction>

可能的子元素:<annotation>

另请参见

参考

XmlSchemaEnumerationFacet