Compartir a través de


Compatibilidad con enlaces del atributo Default

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 una compatibilidad de enlace parcial para el atributo default.

La herramienta Xsd.exe equipara un valor de atributo o elemento predeterminado con un System.ComponentModel.DefaultValueAttribute aplicado a un campo generado; este campo también se inicializa estáticamente con el valor predeterminado.

Explicación

El atributo default, que puede aparecer en una declaración <element> o <attribute>, proporciona un valor predeterminado que se utiliza si el elemento está vacío o si el atributo no está presente cuando se recibe un documento de instancia.

En el caso de los atributos, un valor predeterminado solo es relevante si un atributo es opcional (el atributo use que se describe en Compatibilidad con enlaces del elemento Attribute tiene el valor predeterminado optional). Cuando se especifica un atributo, tiene que especificarse con un valor.

En el caso de los elementos, solo se utiliza un valor predeterminado si el elemento aparece en un documento de instancia sin contenido alguno. Si el elemento no aparece en modo alguno, no se rellena.

Al generar código fuente a partir de un documento del esquema XML, la herramienta Xsd.exe obtiene cada campo correspondiente a un elemento o atributo con un valor predeterminado y aplica System.ComponentModel.DefaultValueAttribute, pasando el valor predeterminado como argumento. Además, Xsd.exe inicializa estáticamente el campo con el valor predeterminado, como en el ejemplo siguiente:

[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;

El atributo predeterminado se omite en las matrices (elementos con el valor de maxOccurs mayor que 1).

Compatibilidad de enlace según el tipo de datos

De acuerdo con el esquema XML, el valor del atributo default debe ser de tipo simple. Xsd.exe conserva el valor predeterminado de la mayoría de tipos simples cuando realiza una traducción de ida y vuelta del esquema XML a las clases y de vuelta a un nuevo documento de esquema XML.

Constituyen una excepción a esta regla los elementos o atributos de tipo xsd:base64Binary o xsd:hexBinary. Un atributo DefaultValue no se aplica al campo System.Byte creado correspondiente.

Otra de las excepciones la constituyen los atributos de tipos de lista. La construcción <list> se utiliza para definir un tipo simple cuyos valores posibles son una serie de valores delimitados por espacios en blanco de otro tipo simple. (Xsd.exe no genera código fuente para los elementos de tipos de lista.) En el caso de las listas, Xsd.exe crea una matriz del tipo constituyente, pero convierte el valor predeterminado en una instancia del tipo constituyente, en lugar de en una matriz.

Tenga en cuenta la siguiente declaración <attribute> de entrada:

<xsd:attribute name="siblings" default="unknown">
  <xsd:simpleType>
    <xsd:list itemType="xsd:string"/>
  </xsd:simpleType>
</xsd:attribute>

Para esta declaración, se genera el siguiente código fuente:

[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";

Este código fuente genera un error al compilarse porque no es posible realizar una conversión de tipos implícita de un objeto String como una matriz de objetos String. Se produce el mismo error en el caso de las listas de cualquier tipo simple, incluidos los tipos de enumeración.

Efecto sobre el atributo minOccurs para tipos de valor de enlace de elementos

Supongamos que un miembro de clase tiene un tipo de valor de .NET Framework y se asigna a un elemento XML (a través del XmlElementAttribute predeterminado). Si Xsd.exe encuentra un atributo DefaultValue aplicado a dicho miembro al generar un documento XSD a partir de clases, genera un valor 0 para el atributo de minOccurs del elemento <element>. Esto indica que el elemento no tiene que aparecer en un documento XML de instancia válido.

Combinación con use="optional" para atributos

Supongamos que una declaración <attribute> contiene un atributo use con un valor optional, que también es el valor predeterminado. Cuando se genera código fuente a partir de un documento XSD, Xsd.exe interpreta este valor en función de si se ha especificado el atributo default. Caben dos posibles interpretaciones:

  • Se ha especificado default: Xsd.exe genera un campo público con XmlAttributeAttribute y DefaultValueAttribute que especifica el valor predeterminado.

  • No se ha especificado default: Xsd.exe genera un campo público con un atributo XmlAttributeAttribute. Además, para los tipos de valor, genera un campo público de tipo bool cuyo nombre es el nombre del campo del atributo al que se anexa Specified. Por ejemplo, si el nombre del campo del atributo es startDate, el nombre del campo bool pasa a ser startDateSpecified. Al serializar un objeto a XML, la clase XmlSerializer comprueba el valor del campo bool para determinar si debe escribir el atributo opcional. El campo bool aparece con System.Xml.Serialization.XmlIgnoreAttribute para evitar que XmlSerializer lo serialice.

Example

Documento de esquema XML de entrada:

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

    <xsd:complexType name="FamilyDogType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:stringo" default="Spot"/>
            <xsd:element name="birthdate" type="xsd:date" default="2002-03-04"/>
        </xsd:sequence>
        <xsd:attribute name="gender" type="GenderType" default="UNKNOWN"/>
        <xsd:attribute name="fixed" type="xsd:boolean" default="false"/>
        <xsd:attribute name="breed" type="xsd:string" default="Swedish Vallhund"/>
    </xsd:complexType>
    
    <xsd:simpleType name="GenderType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="FEMALE" />
            <xsd:enumeration value="MALE" />
            <xsd:enumeration value="UNKNOWN" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

Las clases de C# generadas a partir del documento del esquema XML anterior:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyDog", Namespace="http://example.org/", IsNullable=false)]
public class FamilyDogType {
        
    [System.ComponentModel.DefaultValueAttribute("Spot")]
    public string name = "Spot";
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="date")]
    [System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
    public System.DateTime birthdate = new System.DateTime(631507968000000000);
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(GenderType.UNKNOWN)]
    public GenderType gender = GenderType.UNKNOWN;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @fixed = false;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("Swedish Vallhund")]
    public string breed = "Swedish Vallhund";
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum GenderType {        
    FEMALE,        
    MALE,
    UNKNOWN,
}

El documento de esquema XML generado a partir de un ensamblado compilado con el código fuente de C# anterior es el mismo que el esquema XML original a partir del que se generó el código fuente de C#.

Elementos contenedores posibles: <attribute>, <element>

Vea también

Referencia

System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue