Aller au contenu

Programmation XML/Définition de Type Document

Un livre de Wikilivres.

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 -->

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>

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

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>

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
  >
  1. http://www.w3schools.com/dtd/dtd_elements.asp
  2. http://www.w3schools.com/dtd/dtd_attributes.asp
  3. http://xmlwriter.net/xml_guide/entity_declaration.shtml
  4. http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd