Schéma XML:Déclarations d'éléments et d'attributs
Un article de WikiTuto.
Sommaire |
Déclarations d'éléments
Un élément, dans un schéma, se déclare avec la balise <xsd:element>. Par exemple,
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> <xsd:element name="contacts" type="typeContacts"></xsd:element> <xsd:element name="remarque" type="xsd:string"></xsd:element> </xsd:schema>
Le schéma précédent déclare deux éléments : un élément contacts et un élément remarque. Chaque élément est "typé" -c'est-à-dire qu'il doit respecter un certain format de données. L'élément contacts est ainsi du type typeContacts, qui est un type complexe défini par l'utilisateur. L'élément remarque quant à lui est du type xsd:string qui est un type simple prédéfini de XML Schema.
Chaque élément déclaré est associé à un type de données via l'attribut type. Les éléments pouvant contenir des élément-enfants ou possédr des attributs sont dits de type complexe, tandis que les éléments n'en contenant pas sont dits de type simple. Nous reviendrons plus loin sur cette notion de type de données.
Déclarations d'attributs
Déclaration simple
A la différence des éléments, un attribut ne peut être que de type simple. Cela signifie que les attributs, comme avec les DTD, ne peuvent contenir d'autres éléments ou attributs. De plus, les déclarations d'attributs doivent être placées après les définitions des types complexes, autrement dit, après les éléments <xsd:sequence>, <xsd:choice> et <xsd:all>. Pour mémoire, rappelons que dans une DTD, l'ordre des déclarations n'a pas d'importance.
L'exemple suivant montre la déclaration d'un attribut maj de type xsd:date (un autre type simple) qui indique la date de dernière mise à jour de la liste des contacts.
<?xml version="1.0" encoding="ISO-8859-1"?> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"> <xsd:element name="contacts" type="typeContacts"></xsd:element> <xsd:element name="remarque" type="xsd:string"></xsd:element> <xsd:complexType name="typeContacts"> <xsd:attribute name="maj" type="xsd:date" /> </xsd:complexType> </xsd:schema>
Contraintes d'occurences
Tout comme dans une DTD, un attribut peut avoir un indicateur d'occurences.
L'élément attribute d'un Schema XML peut avoir trois attributs optionnels : use, default et fixed. Des combinaisons de ces trois attributs permettent de paramétrer ce qui est acceptable ou non dans le fichier XML final (attribut obligatoire, optionnel, possédant une valeur par défaut...). Par exemple, la ligne suivante permet de rendre l'attribut maj optionnel, avec une valeur par défaut au 11 octobre 2003 s'il n'apparaît pas (le format de date est standardisé : cette date s'écrit donc à l'anglo-saxonne 2003/10/11 ; cela permet en outre de plus facilement classer les dates).
<xsd:attribute name="maj" type="xsd:date" use="optional" default="2003-10-11" />
Quand l'attribut fixed est renseigné, la seule valeur que peut prendre l'attribut déclaré est celle de l'attribut fixed. Cet attribut permet de "réserver" des noms d'attributs pour une utilisation future, dans le cadre d'une mise à jour du schéma.
Le tableau suivant présente une comparaison entre le format DTD et le XML Schema.
| DTD | Attribut use | Attribut default | Commentaire |
|---|---|---|---|
| #REQUIRED | required | - | |
| "blabla" #REQUIRED | required | blabla | |
| #IMPLIED | optional | - | |
| "blabla" #IMPLIED | optional | blabla | |
| - | prohibited | - | Cet attribut ne doit pas apparaître |
Table 1. Contraintes d'occurences fixables par les attributs use et default.
Il est à noter que la valeur de l'attribut default doit être conforme au type déclaré. Par exemple...
<xsd:attribute name="maj" type="xsd:date" use="optional" default="-43" />
... produirait une erreur à la validation du schéma.
Un autre type de déclaration d'attributs dans les DTD, la liste de choix, est possible grâce à une restriction de type ; nous y reviendrons.
Regroupements d'attributs
XML Schema propose une fonctionnalité supplémentaire, permettant de déclarer des groupes d'attributs (groupes auxquels il est possible de faire appel lors d'une déclaration d'éléments). Cela permet d'éviter de répéter des informations de déclarations.
Déclaration d'élément ne contenant que du texte avec un (ou plusieurs) attribut(s)
Un tel élément est de type complexe, car il contient au moins un attribut. Afin de spécifier qu'il peut contenir également du texte, on utilise l'attribut mixed de l'élément <xsd;complexType>. Par défaut, mixed="false"; il faut dans ce cas forcer mixed="true". Par exemple,
<xsd:element name="elt">
<xsd:complexType mixed="true">
<xsd:attribute name="attr" type="xsd:string" use="optional" />
</xsd:complexType>
</xsd:element>
Déclaration et référencement
La procédure précédente de déclaration d'éléments peut amener à une structure de type "poupée russe" des déclarations. Il est beaucoup plus avantageux, pour des raisons de clarté, d'ordonner ces déclarations, ainsi qu'on peut le voir sur cet exemple (on ne fera pas attention, pour le moment, aux "définitions de type").
Il est recommandé de commencer par déclarer les éléments et attributs de type simple, puis ceux de type complexe. On peut en effet faire "référence", dans une déclaration de type complexe, à un élément de type simple prélablement défini. Par exemple...
<xsd:element name="pages" type="xsd:positiveInteger"></xsd:element>
<xsd:element name="auteur" type="xsd:string"></xsd:element>
<xsd:element name="livre">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="auteur" />
<xsd:element ref="pages" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>



