Compartir a través de


Compatibilidad con enlaces del atributo Mixed

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

Para definir tipos complejos por extensión, la herramienta Xsd.exe equipara un atributo XML mixed="true" con un campo de matriz de cadenas al atributo XmlTextAttribute aplicado.

Explicación

El atributo mixed puede aparecer en los elementos complexType y complexContent. Un valor true indica que el elemento puede contener elementos secundarios, texto de cuerpo (literalmente, datos de caracteres sin tipo) o una combinación de ambos.

De acuerdo con el esquema XML, el valor mixed de <complexContent> reemplaza al valor mixed de <complexType>. Cuando el elemento <complexContent> está presente, constituye el único elemento secundario del elemento <complexType>.

Xsd.exe asigna el valor true del atributo mixed a un campo de matriz de cadenas con un atributo System.Xml.Serialization.XmlTextAttribute, como se muestra a continuación:

[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;

El atributo XmlText indica a la clase XmlSerializer que serialice un miembro de clase como texto de cuerpo. El enlace funciona en ambas direcciones: cuando se genera un archivo .xsd a partir de clases y cuando se genera código fuente a partir de un archivo .xsd.

Derivación de tipos por extensión

La especificación de esquemas XML prohíbe el cambio de contenido mixto a contenido de solo elementos con extensión, y viceversa:

  • El esquema XML prohíbe la creación de tipos complejos con contenido mixto mediante la extensión de tipos complejos con elementos secundarios no mixtos.

  • Del mismo modo, el esquema XML prohíbe la creación de tipos complejos con elementos secundarios no mixtos mediante la extensión de tipos complejos con contenido mixto.

Si Xsd.exe detecta cualquiera de estas extensiones no válidas al generar código fuente a partir de un documento de esquemas XML, emite la siguiente advertencia:

Advertencia de validación de esquemas: el tipo derivado y el tipo base deben tener el mismo tipo de contenido.

Al mismo tiempo, Xsd.exe coloca el campo de matriz de cadenas descrito anteriormente con el atributo XmlText en la clase derivada donde se introduce el contenido mixto. Esto hace que cualquier descendiente tenga contenido mixto.

Se emite la advertencia anterior cuando un tipo complejo antecesor tiene elementos secundarios y un tipo complejo descendiente especifica un valor mixed="true". También se emite la advertencia cuando un tipo complejo antecesor especifica un valor true para el atributo mixed y un tipo complejo descendiente no especifica de forma explícita ningún valor true, ni en el elemento <complexContent> ni en el elemento <complexType>.

En general, cuando se genera un documento de esquemas XML a partir de un conjunto de clases de un ensamblado, Xsd.exe establece el atributo mixed en true en los siguientes elementos:

  • <complexType>: para el tipo complejo donde se introduce el contenido mixto. El tipo corresponde a la clase que contiene el campo de matriz de cadenas con un atributo XmlText. Para que el esquema sea válido, no es necesario que el tipo de datos sea el tipo base complejo, tal y como se explica más adelante en este tema.

  • <complexContent>: para los tipos complejos descendientes.

Aun así, cuando se utiliza un documento de esquemas XML, Xsd.exe acepta que <complexType mixed="true"> especifique contenido mixto heredado para los tipos descendientes, incluso cuando el valor <complexContent mixed="false"> predeterminado debería reemplazarlo. En la traducción inversa a partir del código generado, se restaura el formato esperado, tal y como se indica a continuación:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

Hay una situación en la que se puede introducir contenido mixto en un tipo complejo derivado: cuando el tipo base complejo no contiene ningún elemento secundario (puede tener atributos). Sin embargo, es precisamente en esta situación en la que Xsd.exe, en una operación de traducción de ida y vuelta, genera un esquema XML con un significado diferente.

El tipo derivado que introduce contenido mixto debe especificarse de la siguiente forma:

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

En la traducción inversa, Xsd.exe cambia la posición de mixed="true", como se muestra en el siguiente fragmento de código:

<complexType mixed="true">
    <complexContent mixed="false">
        ...
    </complexContent>
</complexType>

Aquí, de acuerdo con el esquema XML, se supone que el valor false del elemento <complexContent> reemplaza al valor true del elemento <complexType>, lo que convierte el contenido del tipo derivado en contenido no mixto, contradiciendo así la intención original.

Se produce este error porque, para el tipo complejo donde se introduce el contenido mixto, Xsd.exe establece siempre el atributo mixed en true en el elemento <complexType> (y no en el elemento <complexContent>, si estuviese presente).

Aun así, cuando Xsd.exe recibe este resultado inverso como entrada, interpreta coherentemente que el tipo derivado introduce contenido mixto por medio de la conversión del campo de matriz de cadenas con el atributo XmlText en un miembro de la clase correspondiente. Como ya se ha indicado anteriormente, Xsd.exe acepta que <complexType mixed="true"> especifique contenido mixto heredado para los tipos descendientes, incluso cuando <complexContent mixed="false> debería reemplazarlo.

Derivación de tipos por restricción

El esquema XML permite la restricción de tipos complejos con contenido mixto para derivar tipos complejos con elementos secundarios no mixtos. Sin embargo, .NET Framework no reconoce la restricción de tipos complejos. En su lugar, Xsd.exe crea una clase vacía que se hereda de la clase base. Consulte el elemento <restriction>.

Posibles elementos contenedores: <complexContent>, <complexType>

Vea también

Referencia

System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed