Compatibilidad con enlaces del atributo Form
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 atributo form.
La herramienta Xsd.exe equipara el atributo XML form con la propiedad Form de los atributos XmlAttribute o XmlElement, aunque el código de serialización XML de .NET Framework reconoce un valor predeterminado distinto, qualified
, para los elementos.
Explicación
El esquema XML requiere que todos los elementos y atributos que se declaran globalmente (como secundarios del elemento <schema>) aparezcan con espacio de nombres en un documento de instancia. Para los elementos y atributos declarados localmente (dentro de una definición <complexType>), la calificación de espacio de nombres es opcional.
Para especificar si es necesaria la calificación de espacio de nombres de un atributo o elemento local determinado, se agrega el atributo form a una declaración <element> o <attribute> local. Los valores posibles son qualified
y unqualified
.
El valor predeterminado del atributo form se hereda de elementFormDefault o del atributo attributeFormDefault del elemento <schema> de raíz. Para esos dos atributos, el valor predeterminado es unqualified
.
.NET Framework no tiene ninguna forma de especificar form en un nivel global o de ámbito de esquema dentro de una definición de clase. En su lugar, al generar un documento de esquema XML a partir de un conjunto de clases, Xsd.exe crea siempre un esquema XML con las características siguientes:
No especifica attributeFormDefault y vuelve al valor predeterminado de
unqualified
.Especifica
elementFormDefault="qualified"
y usa en la práctica un valor predeterminado diferente del que utiliza el esquema XML.
Xsd.exe responde a valores alternativos para los valores predeterminados attributeFormDefault="qualified"
y elementFormDefault="unqualified"
al establecer form campo por campo.
Ante estas restricciones, Xsd.exe genera código fuente a partir del atributo form como se muestra en la tabla siguiente.
Atributo form |
form="qualified" |
form="unqualified" |
<attribute> |
Se pasa un parámetro a la declaración del atributo XmlAttribute; el parámetro es |
No se pasa ningún parámetro form a la declaración de atributos XmlAttribute al campo <attribute>. |
<element> |
No se aplica ningún atributo XmlElement, a menos que sea para pasar un parámetro no relacionado. |
Se pasa un parámetro a la declaración del atributo XmlElement para el campo <element>; el parámetro es |
El parámetro pasado a la declaración XmlAttribute o XmlElement establece la propiedad Form, cuyos valores posibles proceden de la enumeración XmlSchemaForm:
XmlSchemaForm.Qualified
XmlSchemaForm.Unqualified
XmlSchemaForm.None: valor predeterminado
Solo se especifica form en el código fuente si se establece en el valor no predeterminado del documento del esquema XML original, de acuerdo con los valores predeterminados de .NET Framework en lugar de con los valores predeterminados de esquema XML. Dado que el atributo form reemplaza a los atributos attributeFormDefault y elementFormDefault, un esquema que establece form en el valor no predeterminado del nivel de <schema> y después lo establece en el valor predeterminado del nivel de <attribute> o <element> genera código fuente que no especifica form. Por lo que se refiere a los documentos de instancia que cumplen las especificaciones, el significado sigue siendo el mismo.
Example
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:element name="ComplexInstance" type="MyComplexType"/>
<xsd:complexType name="MyComplexType">
<xsd:sequence>
<xsd:element name="elementQ" type="xsd:decimal" form="qualified" />
<xsd:element name="elementU" type="xsd:Date" form="unqualified" />
</xsd:sequence>
<xsd:attribute name="attributeQ" type="xsd:string" use="required" form="qualified"/>
<xsd:attribute name="attributeU" type="xsd:boolean" use="required" form="unqualified"/>
</xsd:complexType>
</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("ComplexInstance", Namespace="http://example.org/", IsNullable=false)]
public class MyComplexType {
public System.Decimal elementQ;
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string elementU;
[System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
public string attributeQ;
[System.Xml.Serialization.XmlAttributeAttribute()]
public bool attributeU;
}
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="ComplexInstance" type="tns:MyComplexType" />
<xs:complexType name="MyComplexType">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="elementQ" type="xs:decimal" />
<xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="elementU" type="xs:string" />
</xs:sequence>
<xs:attribute form="qualified" name="attributeQ" type="xs:string" />
<xs:attribute name="attributeU" type="xs:boolean" use="required" />
</xs:complexType>
</xs:schema>
Elementos contenedores posibles: <attribute>, <element>
Vea también
Referencia
System.Xml.Schema.XmlSchemaAttribute.Form
System.Xml.Schema.XmlSchemaElement.Form