Поддержка привязки элемента Enumeration

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Платформа .NET Framework обеспечивает частичную поддержку привязки для элемента <enumeration>.

Программа Xsd.exe преобразует аспект <enumeration> в определение платформы .NET Framework enum, только если он применен к строковому типу, например xsd:string.

Объяснение

Элемент <enumeration> служит для создания конечного набора вариантов для выбора из простого типа данных. Он используется, чтобы унаследовать новый простой тип от существующего простого типа путем ограничения базового типа. Базовый тип мог быть создан как перечисление.

Спецификация схемы XML позволяет применять аспект <enumeration> к любому простому типу, за исключением xsd:boolean. Однако при формировании исходного кода из документа схемы XML программа Xsd.exe распознает как перечисления только перечисления, созданные на основе строковых простых типов, таких как xsd:string. В таком случае генерируется определение enum.

В определения типа enum преобразуются следующие встроенные типы языка XSD:

  • string

  • normalizedString

  • token

  • Name

  • NCName

  • ID

  • ENTITY

  • NMTOKEN

При генерировании документа схемы XML из набора классов программа Xsd.exe преобразует определение enum в перечисление на основе xsd:string.

Обработка программой Xsd.exe других простых типов, созданных не на основе строк, зависит как от контекста, так и от типа. Для перечисления на основе встроенного числового типа данных при преобразовании создается поле типа, соответствующего базовому (например, System.Decimal для xsd:decimal), если перечисление используется как элемент или атрибут в рамках сложного типа. В противном случае перечисление игнорируется после заполнения его собственного глобально определенного элемента.

Атрибут value в перечислениях, основанных на строках

Значение перечисления должно либо квалифицироваться как допустимое постоянное имя, либо преобразовываться программой Xsd.exe в постоянное имя. Примером может служить следующее значение перечисления:

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

Это значение преобразуется в следующий член enum:

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

Одиночный пробел удаляется для получения допустимого постоянного имени, и атрибут XmlEnumAttribute применяется к члену enum. Параметр атрибута изменяет значение перечисления схемы XML, используемое для этого значения enum. Значением по умолчанию является само значение 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

Входной документ схемы XML, определяющий перечисления xsd:string и xsd:int:

<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>

Классы C#, созданные на основе приведенного выше документа схемы XML. Целочисленное перечисление заменяется на поле типа 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,
}

Сложный тип и простой тип схемы XML, созданные из сборки, скомпилированной на основе предыдущего исходного кода C#:

  <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, см. в разделе The value attribute in string-based enumerations.

Для всех других типов, которые могут быть перечислениями, атрибут value не учитывается.

См. описание атрибута Поддержка привязки атрибута Value.

Возможные родительские элементы: <restriction>

Возможные дочерние элементы: <annotation>

См. также

Справочник

XmlSchemaEnumerationFacet