Dernière mise à jour :2008-07-24

informatique

Déclaration d'éléments et d'attributs dans une DTD

Dès que l'on entre dans le monde merveilleux du xml, un nouveau mot nous vient très vite à l'oreille. Ce mot est DTD (Définition de type de document). Les DTDs pemettent de gérer la structure d'un document, de définir ses balises (éléments et attributs). Pour un fichier xml bien formé il n'est bien sûr pas obligatoire d'associer une définition de type de document. Par contre, l'absence de DTD impose au document certaines restrictions. En voici la liste ci-dessous:
  1. Le document xml ne peut appeler que les entités de base (lt, gt, amp etc...)
  2. Toutes les valeurs d'attributs doivent être spécifiées.
  3. Aucune valeur d'attribut par défaut ne peut être accepté.
  4. Dans le cas d'élément qui sont entièrement constitué d'autres éléments, c'est à dire que ceux-ci ne peuvent contenir de texte (PCDATA), les espace blanc entre la balise d'ouverture de l'élément contenant et la balise d'ouverture de l'élément contenu ne peuvent être accepté parce que le processeur xml ne pourrait déterminé si l'espace blanc doit être interprété comme une zone PCDATA ou simplement comme un espace blanc sans autre signification qu'une indentation pour permettre une meilleur visualisation du fichier xml.
L'article suivant propose un atelier démontrant les principales notions à savoir lors de la définition d'éléments et d'attributs dans la conception d'une DTD.
Déclaration d'éléments
Le premier type de déclaration dans une DTD est la déclaration d'éléments. La syntaxe de déclaration d'un élément est la suivante:
<!ELEMENT nom contenu>
Le mot nom
Celui-ci représente un nom respectant les règles d'affectation de noms en xml. Ces règles sont décrites dans la liste ci-dessous:
  1. Un nom est toujours formé d'au moins une lettre alphabétique (a à z) ou (A à Z)
  2. Si le nom consiste en plusieurs caractères, il peut débuter par le caractère '_' ou ':'.
  3. Les caractères suivant le '_', le ':' ou le caractère alphabétique sont des caractères des caractères alphabétiques, numériques, tirets, trait de soulignement et certains autres caractères du jeu de caractère Unicode.
  4. Les espaces ou tabulation ne sont pas accepté dans les noms
  5. Les caractères de ponctuation utilisés sont le '.' ou le '-'.
Remarque: Vous pouvez pratiquement donner n'importe quel nom à un élément mais il ne faut pas oublier que l'un des principal avantage de l'utilisation du xml est la clarté des document. Les noms adoptés doivent donc réfléter sur la nature de l'élément en question.
Le mot contenu
Description du contenu de l'élément. Celui-ci peut-être spécifique par l'utilisation de l'un des mots clefs suivant : ANY ou EMPTY. Le contenu peut aussi être un modèle de contenu décrivant les noms des éléments enfants pouvant être contenu dans l'élément, leur fréquence de répétition et/ou leur séquence d'apparition.
Nous considéreront ce bout de fichier xml en guise d'exemple pour le reste de la section décrivant la déclaration d'éléments. Nous ajouteront ensuite de nouvelles informations à ce fichier pour la partie de l'article concernant la déclaration d'attributs.
Listing 1.0
1. <formulaire>
2.   <entete>
3.    <titre>
4.     Formulaire no 1 5.    </titre>
6.   </entete>
7.   <section>
8.    <titre>
9.     Section no 1 10.    </titre>
11.    <corps>
12.     <para>
13.      <input/>
14.     </para>
15.    </corps>
16.   </section>
17.   <section>
18.    <titre>
19.     Section no 2 20.    </titre>
21.    <corps>
22.     <para>
23.      <texte>
Veuillez remplir les deux champs suivant en entié</texte>
24.     </para>
25.     <para>
26.      <input/>
27.      <input/>
28.     </para>
29.    </corps>
30.   </section>
31.   <bas.de.page>
32.    <date.mise.a.jour>
33.     16 juillet 2000 34.    </date.mise.a.jour>
35.   </bas.de.page>
36. </formulaire>
éléments libres
L'élément libre peut contenir n'importe quel éléments déclarés à un autre endroit de la DTD. Le défaut d'utilisé des éléments libres c'est qu'il n'y a pas de posssibilité de controle sur la fréquence et l'ordre des éléments enfants. Pour déclarer un élément libre, il suffit d'utiliser le mot clef ANY comme dans l'exemple suivant:
<!ELEMENT nom ANY>
Dans l'exemple (listing 1.0), nous aurions pu déclaré l'élément formulaire comme étant libre mais pour des soucis de respect des facteurs de fréquence et d'ordre d'apparition, nous laisserons cette option de côté.
éléments vides
L'élément vide ne contient aucun contenu. Vous pouvez utiliser la syntaxe suivante pour noter un élément vide dans un fichier xml:
<nom></nom>
mais la syntaxe suivante est plus couremment utilisée:
<nom/>
Pour déclarer un élément vous devez utiliser la syntaxe suivante:
<!ELEMENT nom EMPTY>
Dans l'exemple du listing 1.0, l'élément 'input' aux lignes 13, 26 et 27 serait donc déclaré de la façon suivante dans la DTD:
<!ELEMENT input EMPTY>
Déclaration avec modèle de contenu
Séquences
Il est possible d'indiquer une liste des éléments enfants acceptés par l'élément parent de la façon suivante:
<!ELEMENT parent (enfant1, enfant2, enfant3)>
L'exemple ci-dessus spécifit que l'élément 'parent' doit obligatoirement contenir les éléments 'enfant1', 'enfant2' et finalement 'enfant3' et que ceux-ci doivent apparaitre une seule fois.
Choix
Il devient parfois utile d'indiquer que l'éléments enfant peut être soit un tel nom ou un autre. Comme par exemple, dans l'exemple de séquence, il aurait pu être utile que le concepteur d'une page xml basée sur votre DTD aurait eu la possibilité de choisir entre l'élément 'enfant1' et 'enfant2'. Pour réalisé ceci, il existe l'opérateur suivant : '|'. En placant un élément devant cette opérateur et après celui-ci, le processeur xml interprétera celà comme un choix entre ces deux éléments. Pour indiquer qu'un choix peut-être fait entre l'élément 'enfant1' et 'enfant2', la syntaxe suivante doit être adoptée:
<!ELEMENT parent ((enfant1 | enfant2), enfant3)>
  • Le caractère ?
  • Le caractère *
  • Le caractère +
Le caractère ?
Ce caractère indique que l'élément (ou groupe d'éléments) enfant peut apparaitre une fois ou ne pas apparaitre du tout. Par exemple, en ce fiant au listing ci-dessus, nous pourrions considéré qu'il n'est pas absolument nécessaire de faire apparaitre la da de dernière mise à jour du formulaire. Donc, l'élément enfant 'date.mise.a.jour' ne serait pas considéré comme obligatoire et si celui-ci devrait apparaitre, il ne devrait pas le faire plus d'une fois. Donc, la syntaxe à adopté pour déclarer l'élément 'bas.de.page' serait la suivante:
<!ELEMENT bas.de.page (date.mise.a.jour?)>
Le caractère *
Ce caractère indique que l'élément (ou groupe d'éléments) enfant peut ne pas apparaitre, apparaitre une seule fois ou encore apparaitre à plusieurs reprises. Dans l'exemple du listing 1.0, l'élément 'para' peut ne pas contenir l'élément 'input' (ligne 23), il peut contenir celui-ci une fois (ligne 13) et il peut aussi contenir celui-ci plusieurs fois (lignes 26 et 27). Le caractère * se révèle donc le caractère approprié pour la déclaration de cet élément comme dans l'exemple suivant:
<!ELEMENT para (input* | texte?)>
Le caractère +
Ce caractère indique que l'élément (ou groupe d'éléments) enfant doit apparaitre au moins une fois et peut apparaitre plusieurs fois. Dans l'exemple du listing 1.0, si on considère qu'un formulaire doit toujours contenir au moins une section mais qu'il peut en contenir plusieurs, ont doit utilisé la syntaxe suivante pour déclarer l'élément 'formulaire':
<!ELEMENT formulaire (entete, section+, bas.de.page)>
Contenu à base textuel
Plus haut dans ce document, nous avons parlé de 3 types de contenu soit un modèle ou encore l'utilisation du mot clé ANY ou EMPTY. Il existe un autre type de contenu soit le contenu textuel. Celui-ci est traité à ce stade du document parce qu'il ne peut être considéré comme un type global car dans certaine occasion, contrairement au type ANY et EMPTY, celui-ci ce retrouve à l'intérieur d'un modèle. Le mot clé utilisé pour définir un élément contenant du contenu à base textuel est 'PCDATA'. Le mot clé est toujours précédé du caractère '#' pour empêcher que le créateur d'une DTD utilise celui-ci comme nom. Sans l'utilisation de ce caractère, il pourrait subvenir des conflits dans une énumération séquentielle d'éléments.
Dans l'exemple du listing 1.0, l'élément 'texte' (ligne 23) devrait être déclaré de la façon suivante:
<!ELEMENT texte (#PCDATA)>
Contenu mixte
Il est possible de déclarer des éléments pouvant contenir du texte ainsi que d'autres éléments. Ces déclarations sont appelées déclarations à contenu mixte. Le dangé de tel déclaration, c'est qu'il est difficile pour le processeur xml de faire la différence entre considérer qu'un espace blanc est du PCDATA ou un simple espace de mise en forme du document. Dans la déclaration d'un élément à contenu mixte, le mot #PCDATA est toujours indiqué en premier, suivit des types d'éléments pouvant apparaitre.
Déclaration d'attributs
Les éléments d'un fichier xml contiennent la plupart du temps un ou plusieurs attributs. Les attributs des éléments sont déclarés dans une liste de déclaration. Les déclarations d'attributs sont faites à l'aide de la syntaxe suivante:
<!ATTLIST nom définitions>
Les déclarations d'attribut ne doivent pas obligatoirement être faites tout de suite après la déclaration de l'élément auxquel correspondent ceux-ci. Par contre, la DTD est beaucoup plus simple à comprendre lorsque cette méthode est utilisée. Le mot 'nom' dans l'exemple de syntaxe de liste d'attributs ci-dessus, signifit le nom de l'élément auquel les attributs sont reliés. Le mot 'définitions' représente le nom des attributs, le type de chacun d'eux ainsi que la valeur par défaut de cette attribut si il y a lieu.
Indication d'occurences
Il est possible d'indiquer la fréquence à laquelle un élément enfant ou un groupe d'éléments enfants peuvent apparaitre à l'aide d'un indicateur d'occurence. Il existe 3 type d'indicateurs. En voici la liste ainsi qu'une description de chacun:
Pour la partie concernant les attribut nous reprendrons l'exemple du listing 1.0 en lui ajoutant des attributs aux différents éléments.
Listing 1.1
1. <formulaire nom="mon_formulaire">
2.   <entete>
3.    <titre>
4.     Formulaire no 1 5.    </titre>
6.   </entete>
7.   <section id="id1">
8.    <titre>
9.     Section no 1 10.    </titre>
11.    <corps>
12.     <para>
13.      <input type="text"/>
14.     </para>
15.    </corps>
16.   </section>
17.   <section id="id2">
18.    <titre>
19.     Section no 2 20.    </titre>
21.    <corps>
22.     <para>
23.      <texte couleur="ROUGE">
Veuillez remplir les deux champs suivant en entié</texte>
24.     </para>
25.     <para>
26.      <input type="text"/>
27.      <input type="hidden"/>
28.     </para>
29.    </corps>
30.   </section>
31.   <bas.de.page>
32.    <date.mise.a.jour>
33.     16 juillet 2000 34.    </date.mise.a.jour>
35.   </bas.de.page>
36. </formulaire>
Types
Il existe trois types d'attributs soit:
  • type chaine
  • type atomique
  • type énuméré
type chaine
Les attribut de ce type sont de simples chaines de caratères. Si un attribut d'un élément dans un document xml n'est pas définit dans une DTD, cet attibut est considéré comme étant de type chaine.
Dans l'exemple du listing 1.1, l'élément formulaire (ligne 1) montre un attribut 'nom' de type texte. En effet, le nom du formulaire aurait pu être n'importe quel chaine de caractère. Cet attribut est donc déclaré de la façon suivante:
<!ATTLIST formulaire nom CDATA>
type atomique
Il existe des type déjà définit en xml. Voici la liste des types ainsi que des contraintes de validité concernant ces types:
  • ID: Les valeurs de ce type doivent correspondre à un nom selon la définition d'un nom dans la recommandation xml (voir les explications concernant les noms d'éléments plus haut dans ce document). Un nom ne doit pas paraitre plus d'une fois dans un document xml. Les valeurs ID doivent identifier seulement les éléments qu'elles désignent.
  • Un seul ID par élément: Aucun élément d'un document xml n'a la possibilité de contenir plus d'un attribut ID.
  • Valeur implicite de l'attribut ID: Un attribut ID doit être déclarée soit #IMPLIED soit #REQUIRED.
  • IDREF: Les valeurs de IDREF doivent correspondres à des noms. Chacun de ces noms doit correspondre à la valeur d'un attribut ID d'un élément quelconque du document XML.
  • Nom d'entité: Les valeurs de type ENTITY doivent être un nom. Les valeurs de type ENTITIES doivent correspondre à plusieurs noms. Chaque nom doit correspondre au nom d'une entitée non-analysable déclarée dans la DTD.
  • Atome nomimal (NMTOKEN): La valeur d'un tel attribut est une chaine d'atomes nominaux combinant plusieurs noms.
  • Atome nomimal (NMTOKENS): Un attribut de ce type possède plusieurs valeurs de type NMTOKEN séparés par des espaces.
Dans l'exemple du listing 1.1, l'élément 'section' (lignes 7 et 17) comprend un attribut 'id' de type atomique. Cet attribut devrait donc être définit comme dans l'exemple suivant:
<!ATTLIST section id ID>
type énuméré
Ceux-ci peuvent prendre une valeur définie dans la déclaration. Il existe deux sortes de types énumérés:
  • Type notation
  • énumération
Type notation
Une énumération devient de type notation lorsque le mot clé 'NOTATION' est utilisé dans la déclaration. Les valeurs possible dans le cas d'un type notation doivent toutes avoir déjà été déclarées.
Dans l'exemple du listing 1.1, l'élément 'input' (lignes 13, 26, 27) contient un attribut 'type'. Cette attribut peut être considéré comme étant de type notation et dans un tel cas devrait être définit comme ceci:
<!ATTLIST input type NOTATION (text | hidden) "text">
énumération
Les types énumérés sont semblable aux notations mis à part que le mot clé ne doit pas obligatoirement être utilisé dans la déclaration de l'attribut.
Dans l'exemple du listing 1.1, l'élément 'texte' (ligne 23) contient un attribut 'couleur'. Cette attribut peut être considéré comme étant de type énumération et dans un tel cas devrait être définit comme ceci:
<!ATTLIST texte couleur (BLEU | ROUGE | JAUNE) "BLEU">
Valeurs par défaut:
Il est possible d'indiquer un mot clé à la fin de la déclaration d'un attribut pour indiquer au processeur xml une action à effectuer lorsque un attribut a été omit dans une balise d'un élément donné. Les trois mots clés possibles sont les suivant:
  • #REQUIRED
  • #IMPLIED
  • #FIXED
#REQUIRED
Lorsque ce mot clé est utilisé, le processeur xml considère le document invalide si l'attribut a été omit. Il est à noté que dans la majeur partie du temps, les attributs ID sont requis. Donc, pour être plus précise, la déclaration de l'attribut 'id' de l'élément 'section' devrait ressemblé à ce qui suit:
<!ATTLIST section id ID #REQUIRED>
#IMPLIED
Dans le cas de l'utilisation de ce mot clé, le processeur xml indique à l'application que l'attribut n'est pas présent. C'est alors à l'application de décider ce qu'elle doit faire dans ce cas. Les valeurs d'attribut IMPLIED servent souvent de compteur pour les applications.
#FIXED
Si une valeur par défaut est précédé de ce mot clef, cette valeur sera considérée comme l'unique valeur acceptable sinon, le processeur xml considérera le document comme invalide.
Voici donc finalement, l'aspect que devrait prendre la DTD sur laquel le bout de fichier du listing 1.1 aurait pu être bâtit:
<!-- listing 1.1 dtd -->

<!- Liste des éléments et de leurs attributs -->

<!ELEMENT formulaire (entete, section+, bas.de.page)>
<!ATTLIST formulaire
nom CDATA>

<!ELEMENT entete (titre)>

<!ELEMENT section (titre, corps)>
<!ATTLIST section
id ID #REQUIRED>

<!ELEMENT bas.de.page (date.mise.a.jour?)>

<!ELEMENT titre (#PCDATA)>

<!ELEMENT corps (para)>

<!ELEMENT date.mise.a.jour (#PCDATA)>

<!ELEMENT para (input* | texte?)>

<!ELEMENT input EMPTY>
<!ATTLIST input
type NOTATION (text | hidden) "text">

<!ELEMENT texte (#PCDATA)>
<!ATTLIST texte
couleur (BLEU | ROUGE | JAUNE) "BLEU">

<!-- Fin de la liste des éléments et de leurs attributs -->
Dans cet atelier vous avez appris les bases des déclarations d'éléments et d'attributs. Vous êtes désormais capable de rédiger vos propre DTD.

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2002-11-20 01:00:00

Aucun commentaire pour l'instant.