Compatibilidad con enlaces del elemento Any
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 <any>.
Al generar el código fuente de un documento de esquema XML, Xsd.exe traduce el elemento <any> en un campo de tipo XmlElement, con un atributo XmlAnyElementAttribute.
Explicación
El comodín <any> permite que aparezca cualquier elemento (de cualquier nombre o tipo simple) en una posición determinada de un documento de instancia XML, con algunas restricciones.
Al generar el código fuente de un documento de esquema XML, Xsd.exe traduce el elemento <any> en un campo de tipo XmlElement, con un atributo XmlAnyElementAttribute. Este atributo permite que una clase represente elementos XML arbitrarios sin enlazarlos a tipos no XML identificados por otros campos o propiedades posibles de la clase.
Si aparece el elemento <any> con un atributo maxOccurs que tiene un valor mayor que 1 o unbounded
, Xsd.exe genera una matriz de XmlElement con un atributo XmlAnyElement. Se genera un elemento XmlElement único cuando el valor del atributo maxOccurs es 1
(el valor predeterminado) o 0
. Para obtener una explicación de este comportamiento, vea el atributo maxOccurs.
Al generar un documento de esquema XML a partir de un conjunto de clases de un ensamblado, Xsd.exe realiza la conversión inversa: se convierte un campo o una propiedad de tipo System.Xml.XmlElement con un atributo XmlAnyElementAttribute en un elemento <any> .
Atributos namespace y processContents
Durante la generación de clases o definiciones de esquema XML, se omiten los atributos namespace y processContents. Esto significa que, independientemente de los valores que tienen esos atributos en una definición de esquema XML original, cuando Xsd.exe genera otro esquema XML desde esas clases, el elemento <any> de esquema XML generado deja de tener esos atributos. Por consiguiente, el último esquema vuelve a los valores predeterminados siguientes:
namespace="##any"
: el atributo namespace especifica los espacios de nombres en los que se debe definir el elemento. Un valor##any
permite cualquier espacio de nombres.processContents="strict"
: al validar la conformidad de un documento XML de instancia con el esquema XML especificado, asegúrese de que todos los tipos de elementos se validan según los espacios de nombres especificados. Si no se reconoce un tipo de elemento, se genera un error de validación.
Igualmente, durante la deserialización de documentos XML en objetos, se omiten los atributos namespace y processContents. En cambio, la clase XmlSerializer se comporta como si los dos atributos se establecieran en los valores siguientes:
namespace="##any"
: éste es el valor predeterminado.processContents="lax"
: al validar la conformidad de un documento XML de instancia con su esquema XML especificado, valide el elemento únicamente si se puede obtener su espacio de nombres; si no es así, asegúrese de que un elemento no reconocido tiene un formato XML correcto.
Nota: |
---|
Aunque en tiempo de ejecución .NET Framework asume processContents="lax" , durante la implementación genera definiciones de esquema XML en las que, de forma predeterminada, se define implícitamente processContents="strict" .
|
Xsd.exe y la clase XmlSerializer proporcionan los mismos enlaces para los atributos namespace y processContents cuando aparecen en el elemento <anyAttribute>.
Ejemplo
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="complexInstance" type="MyComplexType"/>
<xsd:complexType name="MyComplexType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
<xsd:any namespace="##local" processContents="strict"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Clase de C# generada a partir del documento de 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 string field1;
[System.Xml.Serialization.XmlAnyElementAttribute()]
public System.Xml.XmlElement Any;
}
Tipo complejo de esquema XML generado a partir de un ensamblado compilado en el código fuente de C# anterior:
<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="0" maxOccurs="1" name="field1" type="xs:string" />
<xs:any minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Atributos posibles | Compatibilidad de enlace |
---|---|
id |
La utilidad Xsd.exe omite el atributo id, que está pensado para proporcionar un identificador único. |
maxOccurs |
Consulte la sección Explicación en este mismo tema. Vea también el atributo Compatibilidad con enlaces del atributo MaxOccurs. |
minOccurs |
Al generar código fuente a partir de un documento de esquema XML, la herramienta Xsd.exe omite el atributo minOccurs cuando se aplica al elemento <any>. Al generar un documento XSD a partir de clases, la herramienta Xsd.exe genera un valor Vea el atributo Compatibilidad con enlaces del atributo MinOccurs. |
namespace |
Consulte la sección Atributos namespace y processContents en este mismo tema. |
processContents |
Consulte la sección Atributos namespace y processContents en este mismo tema. |
Posibles elementos principales: <choice>, <sequence>
Posibles elementos secundarios: <annotation>