Prise en charge de la liaison de l'élément ComplexType

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 pour l'élément <complexType>.

L'outil Xsd.exe assimile les types complexes de schéma XML aux types .NET Framework dont les propriétés ou les champs publics représentent le contenu du type complexe.

Explication

L'outil Xsd.exe assimile les types complexes de schéma XML aux types .NET Framework dont les champs publics représentent le contenu du type complexe.

Attribut Abstract

Un type complexe est déclaré abstrait (abstract="true") pour garantir que seules les instances de types dérivés, et non les instances du type de base abstrait, apparaissent dans un document XML conforme.

Xsd.exe assimile un type complexe abstrait à une classe abstraite. La conversion fonctionne dans les deux sens entre le code et les documents XSD.

À part l'utilisation du mot clé abstract, la classe abstraite est traitée comme une classe de base non abstraite. Les classes enfants étendent la classe de base. Xsd.exe applique à la classe abstraite un System.Xml.Serialization.XmlIncludeAttribute pour chaque classe descendante. Chaque attribut XmlInclude spécifie le type de la classe descendante.

Exemple : attribut Abstract

L'exemple de code suivant explique l'utilisation de l'attribut abstract avec l'élément <complexType>.

Document de schéma XML d'entrée :

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="FamilyNode" type="FamilyNodeType" />
  <xsd:complexType name="FamilyNodeType">
    <xsd:sequence>
      <xsd:element name="Code" type="xsd:string" />
      <xsd:element name="Parent" type="Parent" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Daughter">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Date" type="xsd:dateTime" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Son">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Info" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Parent" abstract="true">
    <xsd:sequence>
      <xsd:element name="Text" type="xsd:normalizedString" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Grandchild">
    <xsd:complexContent>
      <xsd:extension base="Daughter">
        <xsd:attribute name="Parent" type="xsd:normalizedString" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

Classes C# générées à partir du document de schéma XML précédent :

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyNode", Namespace="http://example.org/", IsNullable=false)]
public class FamilyNodeType {
        
    public string Code;
        
    public Parent Parent;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Son))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Daughter))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public abstract class Parent {
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Son : Parent {        
    public string Info;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public class Daughter : Parent {
        
    public System.DateTime Date;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool DateSpecified;
}
    
 [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Grandchild : Daughter {        
    [System.Xml.Serialization.XmlAttributeAttribute("Parent", DataType="normalizedString")]
    public string Parent1;
}

Le schéma XML généré depuis des classes compilées à partir du code source C# précédent équivaut au schéma XML d'origine.

Attributs possibles Prise en charge de la liaison

abstract

L'utilitaire Xsd.exe assimile un type complexe abstrait, identifié par abstract="true", à une classe abstraite. Pour chaque classe qui hérite de la classe abstraite, Xsd.exe applique à la classe abstraite un System.Xml.Serialization.XmlIncludeAttribute qui spécifie le type de la classe descendante.

Consultez la précédente section Abstract Attribute.

block

L'attribut block peut être appliqué à un type de données pour empêcher les types dérivés de prendre la place du type d'origine à l'endroit où il est spécifié.

L'outil Xsd.exe ignore l'attribut block, ainsi que l'attribut blockDefault de l'élément Prise en charge de la liaison de l'élément Schema.

final

L'attribut final peut être appliqué à un type de données pour empêcher qu'il soit dérivé.

Xsd.exe ignore l'attribut final ainsi que l'attribut finalDefault de l'élément <schema>.

id

L'utilitaire Xsd.exe ignore l'attribut id qui a pour but de fournir un identificateur unique. À la place, Xsd.exe reconnaît l'attribut name.

mixed

Consultez l'attribut mixed.

name

La valeur de l'attribut name devient le nom du type .NET Framework que Xsd.exe génère à partir du type complexe.

Aucune tentative de modification de la casse pour respecter les conventions de codage n'est effectuée. Par exemple, si l'attribut de nom d'un élément <complexType> a la valeur testInfo, la classe résultante est nommée testInfo, plutôt que TestInfo en majuscules. Si un nom est en conflit avec un mot clé réservé, le nom résultant est précédé du symbole @.

Lorsque Xsd.exe génère une définition <complexType> à partir d'une classe, il utilise le nom de la classe comme valeur pour l'attribut name. Un autre nom (valeur de l'attribut name) peut être fourni via la propriété TypeName.

Consultez l'attribut Prise en charge de la liaison de l'attribut Name.

Éléments parents possibles :  <element>, <redefine>, <schema>

Éléments enfants possibles :  <all>, <annotation>, <anyAttribute>, <attribute>, <attributeGroup>, <choice>, <complexContent>, <group>, <sequence>, <simpleContent>

Voir aussi

Référence

XmlSchemaComplexType