Portail collaboratif de partage de la connaissance
Bienvenue sur A525G, un portail collaboratif que tout le monde peut faire évoluer.
informatique
|
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:
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:
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.
É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 ?
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.
Types
Il existe trois types d'attributs soit:
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:
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
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
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 Options | |||||
Réagir à cet article
Aucun commentaire pour l'instant.