Programmation XML/Définition de Type Document
Introduction
[modifier | modifier le wikicode]Le DTD permettent de décrire la forme que doit avoir un document XML pour être valide. Les DTD ont été remplacées par XML Schema qui est bien plus puissant et expressif, aussi nous vous encourageons, pour tout nouveau projet de favoriser systématiquement l'utilisation de Schema aux DTD.
Nous abordons toutefois les DTD ici, afin que vous puissiez en comprendre une si besoin. Notamment, vous pourriez être amener à transformer une DTD en un Schema pour utiliser cette nouvelle technologie.
Spécification d'une DTD
[modifier | modifier le wikicode]Contrairement aux Schema, la DTD n'est pas un dialecte XML, c'est un langage spécifique.
La DTD n'est pas obligatoire. Elle peut être interne au document XML ou bien externe (dans un fichier à l'extension « .dtd »). On utilise une DTD externe lorsque l'on veut la partager entre plusieurs fichiers XML.
Exemple de déclaration d'une DTD externe dans un fichier XML :
<!DOCTYPE repertoire SYSTEM "repertoire.dtd">
La DTD commence par la balise :
<!DOCTYPE nom-element-racine [
et se termine par :
]>
La DTD doit être placée après la déclaration initiale XML.
Les commentaires, comme en XML sont utilisés de la manière suivante :
<!-- commentaires -->
Éléments
[modifier | modifier le wikicode]Chaque élément de la DTD est défini de la manière suivante[1] :
<!ELEMENT nom-element qualificateur>
Les qualificateurs possibles sont :
- ANY : la structure de l'élément est libre
- EMPTY : l'élément est vide
- #PCDATA(Parsed Character Data) : donnée textuelle analysable
On peut préciser ces qualificateurs grâce aux éléments suivants :
- un et un seul sous-élément :
(un seul téléphone par personne)
<!ELEMENT personne(telephone)>
- 0 ou plusieurs sous-éléments :
(une personne peut avoir 0, 1 ou plusieurs téléphones)
<!ELEMENT personne(telephone*)>
- 1 ou plusieurs éléments :
(une personne doit avoir au moins un téléphone)
<!ELEMENT personne(telephone+)>
- 0 ou 1 seul élément :
(une personne a au maximum 1 téléphone, elle peut ne pas en avoir)
<!ELEMENT personne(telephone?)>
- Plusieurs sous-éléments différents :
(une personne a un nom et un téléphone)
<!ELEMENT personne(nom, telephone)>
- Des sous-éléments identiques ou non :
(une personne a un nom et deux numéros de téléphone)
<!ELEMENT personne(nom, telephone, telephone)>
- Un sous-élément OU (exclusif) un autre :
(un ou deux téléphone par personne)
<!ELEMENT personne(telephone|(telephone, telephone))>
Exemple du stockage d'un répertoire de services. Chaque service a un nom et peut avoir un ou plusieurs téléphone(s) :
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE repertoire [
<!ELEMENT repertoire (service)*>
<!ELEMENT service (nom, tel*)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
]>
<repertoire>
<service>
<nom>pompiers</nom>
<tel>18</tel>
</service>
<service>
<nom>police</nom>
<tel>17</tel>
<tel>22</tel>
</service>
<service>
<nom>samu</nom>
<tel>15</tel>
</service>
</repertoire>
Attributs
[modifier | modifier le wikicode]Ils sont déclarés avec ATTLIST
. Par exemple, on définit un type de paiement par défaut en liquide :
<!ATTLIST paiement type CDATA (chèque|liquide) "liquide" >
Valeurs des attributs
[modifier | modifier le wikicode]Les valeurs d'attributs (attribute-value[2]) sont :
Valeur | Explication |
---|---|
value | valeur par défaut de l'attribut |
#REQUIRED | attribut requis |
#IMPLIED | attribut optionnel |
#FIXED value | attribut de valeur fixe |
Types des attributs
[modifier | modifier le wikicode]Type | Description |
---|---|
CDATA |
valeur de la donnée |
(en1|en2|..) |
valeur dans la liste énumérée |
ID |
identifiant unique |
IDREF |
identifiant d'un autre élément |
IDREFS |
liste d'autres identifiants |
NMTOKEN |
nom d'un XML valide |
NMTOKENS |
liste de noms d'XML |
ENTITY |
entité |
ENTITIES |
liste d'entités |
NOTATION |
nom d'une notation |
xml: |
valeur d'un xml prédéfini |
Entités
[modifier | modifier le wikicode]Déclarer une entité permet de l'intégrer ensuite en appelant son nom précédé d'un et commercial, pourcentage ou guillemet ('&', '%' ou ' " '[3]) et suivi d'un point virgule (';'). Ex :
<!ENTITY intro! SYSTEM "https://fr.wikibooks.org/wiki/Programmation_XML/Introduction.xml">!
<b>
&intro;
</b>
Exemple
[modifier | modifier le wikicode]Extrait du cahier des charges XHTML[4] concernant les hyperliens :
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
...
<!ELEMENT link EMPTY>
<!ATTLIST link
%attrs;
charset %Charset; #IMPLIED
href %URI; #IMPLIED
hreflang %LanguageCode; #IMPLIED
type %ContentType; #IMPLIED
rel %LinkTypes; #IMPLIED
rev %LinkTypes; #IMPLIED
media %MediaDesc; #IMPLIED
target %FrameTarget; #IMPLIED
>