Compartir a través de


Compatibilidad con enlaces del elemento Enumeration

Este tema es específico de una tecnología heredada. Ahora, los servicios Web XML y los clientes de servicios Web XML deben crearse con Windows Communication Foundation.

.NET Framework proporciona compatibilidad parcial de enlace para el elemento <enumeration> .

Xsd.exe solo convierte la faceta <enumeration> en una definición enum de .NET Framework cuando aquel se aplica a tipos basados en cadenas como xsd:string.

Explicación

El elemento <enumeration> se usa para crear un conjunto finito de opciones a partir de un tipo de datos simple. Se usa para derivar un nuevo tipo simple a partir de un tipo simple existente mediante la restricción del tipo base. El tipo base puede haberse creado como una enumeración.

La especificación del esquema XML permite aplicar la faceta <enumeration> a cualquier tipo simple, excepto xsd:boolean. Sin embargo, al generar código fuente a partir de un documento de esquema XML, Xsd.exe solo reconoce como enumeraciones las que se basan en tipos de datos simples de cadenas, como xsd:string. En ese caso, la conversión genera una definición enum.

Los siguientes tipos integrados del lenguaje de definición de esquemas XML se convierten en definiciones de tipo enum:

  • string

  • normalizedString

  • token

  • Nombre

  • NCName

  • ID

  • ENTITY

  • NMTOKEN

Al generar un documento de esquema XML a partir de un conjunto de clases, Xsd.exe convierte una definición enum en una enumeración basada en xsd:string.

Lo que hace la herramienta Xsd.exe con otros tipos simples no basados en cadenas depende del contexto y del tipo. Para una enumeración basada en un tipo de datos numéricos integrado, la conversión genera un campo de tipo correspondiente al tipo base (como System.Decimal para xsd:decimal), siempre y cuando la enumeración aparezca como elemento o atributo dentro de un tipo complejo. En caso contrario, la enumeración se omite cuando se limita a llenar su propio elemento definido globalmente.

El atributo de valor en enumeraciones basadas en cadenas

Es necesario que se califique un valor de enumeración como un nombre de constante válido o que Xsd.exe lo convierta en un nombre de constante. Un ejemplo es el siguiente valor de enumeración:

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

Este valor se convierte en el miembro enum siguiente:

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

Se quita el espacio para generar un nombre de constante válido y se aplica un atributo XmlEnumAttribute al miembro enum. El parámetro de atributo cambia el valor de enumeración de esquema XML que se usa para ese valor de enum. El valor predeterminado es el propio valor de enum; en este caso, IRISHCREAM. En el caso de un valor de enumeración del esquema XML que ya esté calificado como un nombre de constante válido, se omite el atributo XmlEnum.

Si bien .NET Framework no convierte una enumeración XSD numérica en una definición enum, sí que convierte una enumeración XSD de cadenas cuyos valores son números. La siguiente definición de tipo simple se enlaza a un tipo enum porque especifica 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>

Se genera el siguiente tipo 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,
}

De nuevo, se utiliza el atributo XmlEnum para reemplazar el enlace predeterminado del valor xsd:enumeration por un valor de enumeración de esquema XML.

Example

Documento de esquema XML de entrada que define enumeraciones xsd:string y 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>

Las clases de C# generadas a partir del documento de esquema XML anterior. Un campo de tipo int ha reemplazado la enumeración de enteros:

[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,
}

Tipo simple y tipo complejo de esquema XML generados a partir de un ensamblado compilado en el código fuente de C# anterior:

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

Atributos posibles Compatibilidad de enlace

id

La utilidad Xsd.exe omite el atributo id, que está pensado para proporcionar un identificador único.

devuelto

Con respecto al uso del atributo value en enumeraciones basadas en tipos de datos simples basados en cadenas, como xsd:string, vea The value attribute in string-based enumerations.

Con el resto de tipos de datos enumerables, se omite el atributo value.

Vea el atributo Compatibilidad con enlaces del atributo Value.

Posibles elementos primarios: <restriction>

Posibles elementos secundarios: <annotation>

Vea también

Referencia

XmlSchemaEnumerationFacet