Partager via


Prise en charge de la liaison de l'attribut Mixed

Cette rubrique est spécifique à une technologie existante. Les services Web XML et les clients du service Web XML doivent à présent être créés à l'aide de Windows Communication Foundation.

Le .NET Framework prend en charge la liaison partielle pour l'attribut mixed.

Pour définir des types complexes par extension, l'outil Xsd.exe assimile un attribut XML mixed="true" avec un champ de tableau de chaînes au XmlTextAttribute appliqué.

Explication

L'attribut mixed peut apparaître dans les éléments complexType et complexContent. La valeur true indique que l'élément peut contenir des éléments enfants ou du corps de texte (littéralement, des données caractères non typées), ou une combinaison des deux.

La valeur mixed pour <complexContent> substitue la valeur mixed pour <complexType>, d'après le schéma XML. Lorsqu'il est présent, l'élément <complexContent> est le seul enfant de l'élément <complexType>.

Xsd.exe mappe un paramètre true pour l'attribut mixed à un champ de tableau de chaînes avec un attribut System.Xml.Serialization.XmlTextAttribute comme suit :

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

L'attribut XmlText demande à la classe XmlSerializer de sérialiser un membre de classe comme corps de texte. La liaison fonctionne dans les deux sens : lors de la génération d'un fichier .xsd à partir des classes et lors de la génération de la source à partir d'un fichier .xsd.

Dérivation du type par extension

La spécification de schéma XML interdit le basculement entre du contenu mixte et du contenu limité à des éléments avec l'extension :

  • Le schéma XML interdit la création de types complexes avec du contenu mixte en étendant les types complexes avec des éléments enfants non mixtes.

  • De même, le schéma XML interdit la création de types complexes avec des éléments enfants non mixtes en étendant les types complexes avec le contenu mixte.

Si Xsd.exe rencontre l'une ou l'autre de ces extensions illégales lors de la génération du code source à partir d'un document de schéma XML, il émet l'avertissement suivant :

Avertissement de validation de schéma : Le type dérivé et le type de base doivent posséder le même type de contenu.

Dans le même temps, Xsd.exe place le champ de tableau de chaînes décrit précédemment avec l'attribut XmlText dans la classe dérivée où le contenu mixte est introduit. Par conséquent, tous les descendants ont du contenu mixte.

L'avertissement ci-dessus est émis lorsqu'un type complexe ancêtre a des éléments enfants et qu'un type complexe descendant spécifie mixed="true". Cet avertissement est également émis lorsqu'un type complexe ancêtre spécifie la valeur true pour l'attribut mixed et qu'un type complexe descendant ne spécifie pas explicitement la valeur true dans l'élément <complexContent> ou <complexType>.

En général, lors de la génération d'un document de schéma XML à partir d'un ensemble de classes dans un assembly, Xsd.exe affecte à l'attribut mixed la valeur true dans les éléments suivants :

  • <complexType> : pour le type complexe dans lequel le contenu mixte est introduit. Le type correspond à la classe qui contient le champ de tableau de chaînes avec un attribut XmlText. Le type de données ne doit pas nécessairement être le type complexe de base pour que le schéma soit valide, comme expliqué ultérieurement dans cette rubrique.

  • <complexContent> : pour les types complexes descendants.

Même dans ce cas, lors de l'utilisation d'un document de schéma XML, Xsd.exe accepte <complexType mixed="true">``<complexContent mixed="false"> afin d'indiquer le contenu mixte hérité pour les types descendants, même aux endroits où le par défaut doit le substituer. Lors de la traduction inverse à partir du code généré, le format attendu est restauré, comme suit :

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

Il existe une situation dans laquelle le contenu mixte peut être introduit dans un type complexe dérivé : lorsque le type complexe de base ne contient pas d'éléments enfants (il peut avoir des attributs). Toutefois, c'est également dans cette situation que Xsd.exe génère un schéma XML avec une signification différente lors d'une traduction aller-retour.

Le type dérivé qui introduit le contenu mixte doit être spécifié comme suit :

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

Lors de la traduction inverse, Xsd.exe bascule le positionnement de mixed="true", comme indiqué dans l'extrait suivant :

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

À cette étape, d'après le schéma XML, la valeur false pour l'élément <complexContent> est supposée substituer la valeur true pour l'élément <complexType>, ce qui rend le contenu du type dérivé non mixte et va à l'encontre de l'intention d'origine.

L'erreur survient car pour le type complexe dans lequel le contenu mixte est introduit, Xsd.exe affecte toujours à l'attribut mixed la valeur true dans l'élément <complexType>, et non dans l'élément <complexContent>, le cas échéant.

En outre, lorsque Xsd.exe reçoit cette sortie inversée comme entrée, il interprète de façon cohérente le type dérivé comme introduisant du contenu mixte en faisant du champ de tableau de chaînes avec l'attribut XmlText un membre de la classe correspondante. Comme noté précédemment, Xsd.exe accepte <complexType mixed="true">``<complexContent mixed="false> afin d'indiquer du contenu mixte hérité pour les types descendants, même aux endroits où doit le substituer.

Dérivation du type par restriction

Le schéma XML permet à la restriction de types complexes avec du contenu mixte de dériver des types complexes avec des éléments enfants non mixtes. Toutefois, le .NET Framework ne reconnaît pas la restriction de type complexe. À la place, Xsd.exe crée une classe vide qui hérite de la classe de base. Consultez l'élément <restriction>.

Éléments parents possibles :  <complexContent>, <complexType>

Voir aussi

Référence

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