Technologies internet


DTD


Voir:

Contexte

Objectifs

L'objectif d'une DTD est de pouvoir définir un modèle de données formel, sous forme électronique, afin que les outils puissent valider, de façon automatisée, la conformité d'une classe de documents XML à ce modèle.

Une DTD définit tout ce qui est nécessaire comme ressources à tous les documents d'une classe donnée. Si un document XML doit inclure des fragments externes, ceux-ci seront définis et identifiés de façon formelle au sein de la DTD, afin de pouvoir ensuite être appelés au sein des documents.

Principes

Modèles de documents

Une DTD permet de définir une organisation d'éléments entre eux et des typages de ces éléments via des notions d'attribut (de valuation).

Plus précisément, une DTD définit un modèle d'organisation hiérarchique de documents XML en utilisant :

La syntaxe utilisée pour écrire des DTD est une syntaxe ad hoc. Par exemple, déclarer un élément article contenant un en-tête et un corps s'écrira :

<!ELEMENT article (en-tete, corps) >

Cette syntaxe est concise et simple, mais présente le grand désavantage de ne pas être celle utilisée pour écrire des documents XML et, donc, de ne pas pouvoir être analysée par des outils XML standard. C'est une des raisons qui amène à la définition des modèles Schema.

DTD et entités

Les entités de caractères

Entités internes

Entités externes

Ce mécanisme d'inclusion est extrêmement utile pour toutes les opérations de modularisation et de réutilisation.

Note: il n'y a pas de concept d'espace de noms pour les DTDs. Quand on importe une DTD externe dans la DTD courante, les symboles définis dans la DTD externe deviennent accessibles de la même façon que les symboles définis de manière interne. Il y a donc risque de collision de noms si la DTD externe emploie un ou plusieurs symboles identiques à ceux de la DTD courante.

Les entités paramétriques

Les éléments

Les attributs

Utilisation d'une DTD dans un document XML

Exemples

Une DTD pour des articles :

<!-- ce qui suit permet d'utiliser tous les elements de HTML -->

<!ENTITY % html PUBLIC
"-//W3C//XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
%html;

<!-- l'element "article" doit contenir, en sequence, un element titre, un element auteur, un element date, un element lieu et un element texte
-->
<!ELEMENT article (titre, auteur, date, lieu, texte)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT lieu (#PCDATA)>
<!-- l'element "texte" peut contenir du texte et des elements "grand" et "image" en nombre indetermine>
-->
<!ELEMENT texte (#PCDATA|grand|image)*>
<!ELEMENT grand (#PCDATA)>
<!-- l'element "image" doit contenir une balise HTML img et une legende facultative
-->
<!ELEMENT image (img, (legende)?)>
<!ELEMENT legende (#PCDATA)>

Il n'est toutefois pas recommandé d'inclure ainsi la totalité de la DTD du langage HTML, car cela risquerait d'être assez "indigeste" pour le navigateur. Le document XML pourrait être ainsi :

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article SYSTEM "Exemple.dtd">
<?xml-stylesheet type="text/css" href="Exemple.css"?>
<article xmlns:html="http://www.w3.org/Profiles/XHTML-transitional">
  <titre>Un journaliste accuse, un policier d&#233;ment</titre>
  <auteur>Alain Connu</auteur>
  <date>14 juin 1972</date>
  <lieu>banquise</lieu>
  <texte>
    <grand>Un journaliste de la place accuse</grand>
    les autorit&eacute;s ...
    <image>
      <html:img html:src="photo.gif" />
      <legende>Legende de la photo</legende>
    </image>
    ...
  </texte>
</article>