Compartir a través de


Compatibilidad con enlaces del elemento Attribute

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 con enlaces para el elemento <attribute> .

Sin embargo, Xsd.exe no distingue un atributo declarado localmente de una referencia a un atributo declarado globalmente, a menos que se declare el atributo global en un espacio de nombres distinto del espacio de nombres de destino del esquema.

Explicación

La especificación del esquema XML indica que un atributo se puede declarar localmente, dentro de una definición de tipo complejo, o globalmente, en cuyo caso se puede hacer referencia al tributo con una o más definiciones de tipos complejos mediante el atributo ref.

A continuación se muestra un ejemplo de atributo declarado localmente:

<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>

A continuación se muestra un ejemplo del mismo atributo declarado globalmente, al que después se hace referencia:

<xsd:attribute name="name" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute ref="name"/>
</xsd:complexType>

Xsd.exe no distingue un atributo declarado localmente de una referencia a un atributo declarado globalmente, a menos que se declare el atributo global en un espacio de nombres distinto del espacio de nombres de destino del esquema.

Referencia en el mismo espacio de nombres

Dado que Xsd.exe no distingue en el mismo espacio de nombres, una conversión de ida y vuelta entre esquema XML y clases crea un atributo local en lugar de lo que había sido un atributo global y una referencia.

Referencia a otro espacio de nombres

Si una declaración global a la que se hace referencia pertenece a un espacio de nombres distinto, Xsd.exe especifica el espacio de nombres utilizando la propiedad Namespace de un atributo XmlAttributeAttribute que se aplica a un campo general. Para ese elemento en particular, el espacio de nombres especificado a través de la propiedad espacio de nombres reemplaza al espacio de nombres especificado en el nivel de clase usando el atributo XmlTypeAttribute y, opcionalmente, XmlRootAttribute. A continuación se muestra un ejemplo:

[System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]

public string Key;

Los espacios de nombres adicionales se importan en una definición de esquema XML utilizando el elemento <import>.

Example

En este primer ejemplo, se muestra cómo procesa Xsd.exe un atributo global cuando dicho atributo está definido en el espacio de nombres de destino que contiene una referencia al atributo.

Documento de esquema XML de entrada:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:attribute name="version" type="xsd:string"/>
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required"/>
  </xsd:complexType>
  <xsd:element name="key" type="keyInfo"/>
</xsd:schema>

Clase de C# generada a partir del documento del esquema XML anterior:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

El documento del esquema XML que se ha generado a partir de un ensamblado compilado con el anterior código fuente C#:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute name="version" type="xs:string" />
    <xs:attribute name="public" type="xs:boolean" />
  </xs:complexType>
</xs:schema>

En el esquema XML anterior generado, el atributo de versión, que al principio se declaró globalmente, se ha convertido en atributo local.

En este segundo ejemplo se muestra cómo procesa Xsd.exe una referencia a un atributo global cuando dicho atributo está definido en un espacio de nombres independiente. En este ejemplo se utiliza el elemento <import> para importar un segundo espacio de nombres ubicado en un archivo XSD independiente. (El atributo <import> del elemento schemaLocation no se usa para especificar la ubicación del archivo .xsd importado. En su lugar, con respecto a Xsd.exe, el archivo se especifica como argumento de línea de comandos adicional).

Documento de esquema XML de nivel superior usado como entrada:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" xmlns:attr="http://example.org/attr">
  <xsd:import  namespace="http://example.org/attr" />
  <xsd:element name="key" type="keyInfo" />
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="attr:version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required" />
  </xsd:complexType>
</xsd:schema> 

Documento de esquema XML importado usado como entrada:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
            xmlns="http://example.org/attr" targetNamespace="http://example.org/attr">
  <xsd:attribute name="version" type="xsd:string" />
</xsd:schema> 

Clase de C# generada a partir de los dos documentos de esquema XML anteriores:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

El documento de esquema XML de nivel superior que se ha generado a partir de un ensamblado compilado con el anterior código fuente C#:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://example.org/attr" />
  <xs:element name="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute xmlns:q1="http://example.org/attr" ref="q1:version" />
    <xs:attribute name="public" type="xs:boolean" />
  </xs:complexType>
</xs:schema>

El documento de esquema XML importado que se ha generado a partir de un ensamblado compilado con el anterior código fuente C#:

<xs:schema xmlns:tns="http://example.org/attr" elementFormDefault="qualified" targetNamespace="http://example.org/attr" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="version" type="xs:string" />
</xs:schema>

Atributo use

El atributo use de una declaración de <attribute> determina si el atributo puede o debe aparecer en un documento XML de instancia.

Atributo use: generar código fuente a partir de un documento de esquema XML

La interpretación que hace Xsd.exe de un valor optional del atributo use depende de si se ha especificado un valor de atributo predeterminado mediante el atributo default. Los valores posibles de use, incluidas las combinaciones optional y default, se muestran con sus resultados de Xsd.exe como se indica a continuación:

  • required: Xsd.exe genera un campo público con un System.Xml.Serialization.XmlAttributeAttribute.

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

  • No se ha especificado optional con default:: Xsd.exe genera un campo público con un atributo XmlAttributeAttribute. Además, si el tipo del atributo no es un tipo de referencia (por ejemplo, una cadena), generará un campo público de tipo bool cuyo nombre es el nombre del campo de 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.

  • prohibited: Xsd.exe no genera nada.

Atributo use: generar un documento de esquema XML a partir de clases

Xsd.exe no especifica el atributo use en ninguno de los dos casos siguientes y se recupera el valor predeterminado optional:

  • Hay un campo bool público adicional que sigue la convención de nomenclatura de Specified.

  • Se asigna al miembro un valor predeterminado a través de un atributo de tipo System.Component.DefaultValueAttribute.

Si no se cumple ninguna de estas condiciones, Xsd.exe genera un valor required para el atributo use.

Ejemplo: Atributo use

Tipo complejo del esquema XML de entrada:

<xsd:complexType name="Numbers">
  <xsd:attribute name="optionalNumber" type="xsd:int" use="optional"/>
  <xsd:attribute name="requiredNumber" type="xsd:int" use="required"/>
  <xsd:attribute name="prohibitedNumber" type="xsd:int" use="prohibited"/>
</xsd:complexType>

Clase de C# generada a partir del tipo complejo anterior:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://example.org/", IsNullable=false)]
public class Numbers {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int optionalNumber;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool optionalNumberSpecified;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int requiredNumber;
}

El tipo complejo generado a partir de la clase de C# anterior es, de hecho, equivalente al tipo complejo original.

Atributos posibles Compatibilidad de enlace

default

El atributo default proporciona un valor predeterminado por si el elemento está vacío o el atributo no está presente cuando se recibe un documento de instancia.

Al generar código fuente a partir de un documento del esquema XML, la herramienta Xsd.exe obtiene cada campo correspondiente a un 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)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public int age = -1;

Asimismo, al generar código fuente a partir de un esquema, Xsd.exe comprueba si se ha especificado el atributo default para determinar cómo se debe interpretar un atributo use con un valor optional. Vea el atributo default para obtener una explicación completa.

La herramienta Xsd.exe no genera código fuente válido para los atributos de tipos de lista con valores predeterminados. Este caso se describe con el atributo default. Vea también el elemento <list>.

fixed

Para las declaraciones de <attribute>, Xsd.exe utiliza el valor del atributo fixed para inicializar estáticamente el campo en el valor fijo, tal y como se muestra en el siguiente ejemplo:

[System.Xml.Serialization.XmlAttribute()]
public in age = -1;

Consulte el atributo fixed.

form

La herramienta Xsd.exe equipara el atributo XML form del elemento <attribute> con la propiedad Form de XmlAttributeAttribute. La infraestructura de serialización XML de .NET Framework reconoce el valor predeterminado del esquema XML, unqualified.

Si una declaración de <attribute> de un esquema XML especifica form="qualified", Xsd.exe genera un atributo XmlAttribute para el campo correspondiente y pasa un parámetro para el atributo, Form=XmlSchemaForm.Qualified.

Consulte el atributo form.

id

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

nombre

Para generar código fuente a partir de un documento XSD, el valor del atributo name proporciona el nombre del campo de clase pública que representa ese atributo. Si un nombre se encuentra en conflicto con una palabra clave reservada, el nombre resultante lleva el prefijo con el símbolo @.

Cuando Xsd.exe genera una declaración <attribute> a partir de un campo de clase pública, utiliza el nombre del campo para el valor del atributo name. Se puede proporcionar un nombre alternativo (valor de atributo name) a través de la propiedad AttributeName.

Consulte el atributo Compatibilidad con enlaces del atributo Name.

ref

Al generar un tipo de .NET Framework a partir de un tipo complejo del esquema XML, Xsd.exe no distingue un atributo declarado localmente de una referencia a un atributo declarado globalmente, a menos que se declare este último en un espacio de nombres distinto del espacio de nombres de destino del esquema.

Consulte las secciones Referencia dentro del mismo espacio de nombres y Referencia a otro espacio de nombres.

tipo

La herramienta Xsd.exe asocia los tipos de datos a los que se hace referencia con el atributo type de las declaraciones <attribute> y <element> con los tipos .NET Framework.

Xsd.exe no genera ningún tipo de .NET Framework para un tipo de datos de esquema XML a menos que se pueda realizar un seguimiento del tipo de datos hasta una declaración de elemento global que haga referencia a un tipo de datos mediante el atributo type.

use

Si es use=“optional”, Xsd.exe comprueba la presencia del atributo default para determinar si se debe generar un atributo DefaultValueAttribute o un campo –Specified adicional. El campo adicional no se genera para los tipos de referencia (por ejemplo, cadenas). La ausencia de ambos para un campo público provoca que Xsd.exe especifique use=“required” en un documento XSD generado.

Consulte la sección anterior, Atributo use.

Posibles elementos primarios: <attributeGroup>, <complexType>, <extension>, <restriction>, <schema>

Posibles elementos secundarios: <annotation>, <simpleType>

Vea también

Referencia

XmlSchemaAttribute