Link Search Menu Expand Document

DTD - les attributs et les entités

Dans le chapitre précédent, nous avons vu comment décrire les balises de nos documents XML, mais ce n’est pas suffisant pour pouvoir décrire l’intégralité d’un document XML. En effet, rappelez vous qu’une balise peut contenir ce qu’on appelle des attributs. Il convient donc de décrire les règles relatives à ces attributs. C’est ce que nous allons voir au cours de ce chapitre.

Ce chapitre sera également l’occasion de découvrir une nouvelle notion dont je n’ai pas encore parlé : les entités. Je ne vous en dis pas plus pour le moment, je préfère garder un peu de suspens autour de la définition de cette notion et son utilisation. 😉

Les attributs

Dans le chapitre précédent, nous avons découvert la syntaxe permettant de définir des règles sur les balises de nos documents XML. Vous allez voir que le principe est le même pour définir des règles à nos attributs.

La syntaxe

Pour indiquer que notre règle porte sur un attribut, on utilise le mot clef ATTLIST. On utilise alors la syntaxe suivante :

<!ATTLIST balise attribut type mode>

Une règle peut donc se diviser en 5 mots clefs : ATTLIST, balise, attribut, type et mode.

Retour sur la balise et l’attribut

Il n’est pas nécessaire de s’attarder trop longtemps sur le sujet, il suffit simplement d’écrire le nom de la balise et de l’attribut concerné par la règle.

Par exemple, reprenons une balise du TP de la partie 1 :

<personne sexe="masculin"/>

On écrira alors :

<!ATTLIST personne sexe type mode>

Retour sur le type

Cet emplacement a pour vocation de décrire le type de l’attribut. Est-ce une valeur bien précise ? Est-ce du texte ? Un identifiant ?

Cas d’un attribut ayant pour type la liste des valeurs possibles

Nous allons étudier ici le cas d’un attribut ayant pour type une liste de valeurs. Les différentes valeurs possibles pour l’attribut sont séparées par une barre verticale.

<!ATTLIST balise attribut (valeur 1 | valeur 2 | valeur 3 | etc.) mode>

Reprenons une nouvelle fois la balise <personne />. Nous avons vu que cette balise possède un attribut sexe. Nous allons ici imposer la valeur que peut prendre cet attribut : soit masculin, soit féminin.

Voici ce à quoi la règle portant sur l’attribut dans notre DTD doit ressembler :

<!ATTLIST personne sexe (masculin|féminin) mode>

Quelques exemples de documents XML possibles :

<!-- valide -->
<personne sexe="masculin" />

<!-- valide -->
<personne sexe="féminin" />

<!-- invalide -->
<personne sexe="autre" />

Cas d’un attribut ayant pour type du texte non “parsé”

Derrière le terme “texte non “parsé” se cache en fait la possibilité de mettre ce que l’on veut comme valeur : un nombre, une lettre, une chaîne de caractères, etc. Il s’agit de données qui ne seront pas analysées par le “parseur” au moment de la validation et/ou l’exploitation de votre document XML.

Dans le cas où notre attribut contient du texte non “parsé”, on utilise le mot clef CDATA.

<!ATTLIST balise attribut CDATA mode>

Soit la règle suivante :

<!ATTLIST personne sexe CDATA mode>

Notre document XML répondant à cette règle peut ressembler à cela :

<!-- valide -->
<personne sexe="masculin" />

<!-- valide -->
<personne sexe="féminin" />

<!-- valide -->
<personne sexe="autre" />

<!-- valide -->
<personne sexe="12" />

Cas d’un attribut ayant pour type un identifiant unique

Il est tout à fait possible de vouloir qu’une balise possède un attribut permettant de l’identifier de manière unique.

Prenons par exemple l’exemple d’une course à pied. Dans le classement de la course, il y aura un unique vainqueur, un unique second et un unique troisième.

Pour indiquer que la valeur de l’attribut est unique, on utilise le mot clef ID comme IDentifiant.

<!ATTLIST balise attribut ID mode>

Prenons par exemple la règle suivante :

<!ATTLIST personne position ID mode>

Voici quelques exemples de documents XML :

<!-- valide -->
<personne position="POS-1"/>
<personne position="POS-2"/>
<personne position="POS-3"/>

<!-- invalide -->
<personne position="POS-1"/>
<personne position="POS-1"/>
<personne position="POS-2"/>

Cas d’un attribut ayant pour type une référence à un identifiant unique

Il est tout à fait possible que dans votre document, un de vos attributs fasse référence à un identifiant. Cela permet souvent de ne pas écrire 100 fois les mêmes informations.

Par exemple, votre document XML peut vous servir à représenter des liens de parenté entre des personnes. Grâce aux références, nous n’allons pas devoir imbriquer des balises XML dans tous les sens pour tenter de représenter le père d’une personne ou le fils d’une personne.

Pour faire référence à un identifiant unique, on utilise le mot clef IDREF.

Prenons par exemple la règle suivante :

<!ATTLIST father id ID mode >
<!ATTLIST child id ID mode
          father IDREF mode
>

Cette règle signifie que la balise child a 2 attributs : id qui est l’identifiant unique de la personne et father qui fait référence une autre personne.

Illustrons immédiatement avec un exemple XML :

<!-- valide -->
<father id="PER-1"/>
<child id="PER-2" father="PER-1"/>

<!-- invalide -->
<!-- l'identifiant PER-0 n'apparaît nulle part -->
<father id="PER-1"/>
<child id="PER-2" father="PER-0"/>

Dans cet exemple, la personne PER-2 a pour père la personne PER-1. Ainsi, on matérialise bien le lien entre ces 2 personnes.

Retour sur le mode

Cet emplacement permet de donner une information supplémentaire sur l’attribut comme par exemple une indication sur son obligation ou sa valeur.

Cas d’un attribut obligatoire

Lorsqu’on souhaite qu’un attribut soit obligatoirement renseigné, on utilise le mot clef #REQUIRED.

Par exemple, si l’on souhaite que le sexe d’une personne soit renseigné, on utilisera la règle suivante :

<!ATTLIST personne sexe (masculin|féminin) #REQUIRED>

Voici alors quelques exemple de documents XML possibles :

<!-- valide -->
<personne sexe="masculin"/>

<!-- valide -->
<personne sexe="féminin"/>

<!-- invalide -->
<personne />

Cas d’un attribut optionnel

Si au contraire on souhaite indiquer qu’un attribut n’est pas obligatoire, on utilise le mot clef #IMPLIED.

Si l’on reprend l’exemple précédent, on peut indiquer qu’il n’est pas obligatoire de renseigner le sexe d’une personne par la règle suivante :

<!ATTLIST personne sexe CDATA #IMPLIED>

Voici alors quelques exemple de documents XML possibles :

<!-- valide -->
<personne sexe="masculin"/>

<!-- valide -->
<personne sexe="féminin"/>

<!-- valide -->
<personne sexe="15"/>

<!-- valide -->
<personne/>

Cas d’une valeur par défaut

Il est également possible d’indiquer une valeur par défaut pour un attribut. Il suffit tout simplement d’écrire cette valeur “en dur” dans la règle.

Par exemple, il est possible d’indiquer qu’une personne dont l’attribut sexe n’est pas renseigné est un homme par défaut grâce à la règle suivante :

<!ATTLIST personne sexe CDATA "masculin">

Voici alors quelques exemple de documents XML possibles :

<!-- valide -->
<personne sexe="masculin"/>

<!-- valide -->
<personne sexe="féminin"/>

<!-- valide -->
<!-- l'attribut sexe vaut "masculin" -->
<personne/>

Cas d’une constante

Enfin, il est possible de fixer la valeur d’un attribut quand celui-ci est présent grâce au mot clef #FIXED suivi de ladite valeur.

Cette situation peut par exemple se rencontrer lorsque l’on souhaite travailler dans une devise bien précise et que l’on souhaite qu’elle apparaisse dans le document.

Par exemple, la règle suivante permet d’indiquer que la devise, dans le cas où elle est renseignée, doit obligatoirement avoir pour seule valeur possible l’euro.

<!ATTLIST objet devise CDATA #FIXED "Euro">

Voici alors quelques exemple de documents XML possibles :

<!-- valide -->
<objet devise="Euro"/>

<!-- invalide -->
<objet devise="Dollar"/>

<!-- valide -->
<objet/>

Les entités

Une autre notion assez importante concernant le DTD est la notion d’entité.

Définition

Une entité peut-être considérée comme un alias permettant de réutiliser des informations au sein du document XML ou de la définition DTD.

Au cours de ce chapitre, nous reviendrons sur les 3 types d’entités qui existent : les entités générales, les entités paramètres et les entités externes.

Les entités générales

Définition

Les entités générales sont les entités les plus simples. Elles permettent d’associer un alias à une information afin de l’utiliser dans le document XML.

La syntaxe

Voyons tout de suite la syntaxe d’une entité générale :

<!ENTITY nom "valeur">

Pour utiliser une entité générale dans notre document XML, il suffit d’utiliser la syntaxe suivante :

&nom;

Afin d’illustrer un peu plus clairement mes propos, voyons tout de suite un exemple :

<!ENTITY samsung "Samsung">
<!ENTITY apple "Apple">

<telephone>
  <marque>&samsung;</marque>
  <modele>Galaxy S3</modele>
</telephone>
<telephone>
  <marque>&apple;</marque>
  <modele>iPhone 4</modele>
</telephone>

Au moment de son interprétation, les références aux entités seront remplacées par leurs valeurs respectives, ce qui donne une fois interprété :

<telephone>
  <marque>Samsung</marque>
  <modele>Galaxy S3</modele>
</telephone>
<telephone>
  <marque>Apple</marque>
  <modele>iPhone 4</modele>
</telephone>

Les entités paramètres

Définition

Contrairement aux entités générales qui apparaissent dans les documents XML, les entités paramètres n’apparaissent que dans les définitions DTD. Elles permettent d’associer un alias à une partie de la déclaration de la DTD.

La syntaxe

Voyons tout de suite la syntaxe d’une entité paramètre :

<!ENTITY % nom "valeur">

Pour utiliser une entité paramètre dans notre DTD, il suffit d’utiliser la syntaxe suivante :

%nom;

Prenons par exemple ce cas où des téléphones ont pour attribut une marque :

<telephone marque="Samsung"/>
<telephone marque="Apple"/>

Normalement, pour indiquer que l’attributmarquede la balise <telephone/> est obligatoire et qu’il doit contenir la valeur Samsung ou Apple, nous devons écrire la règle suivante :

<!ATTLIST telephone marque (Samsung|Apple) #REQUIRED>

À l’aide d’une entité paramètre, cette même règle s’écrit de la façon suivante :

<!ENTITY % listeMarques "marque (Samsung|Apple) #REQUIRED">
<!ATTLIST telephone %listeMarques; >

Encore une fois, au moment de son interprétation, les références aux entités seront remplacées par leurs valeurs respectives.

Les entités externes

Définition

Il existe en réalité 2 types d’entités externes : les analysées et les non analysées. Dans le cadre de ce cours, nous nous limiterons aux entités externes analysées.

Les entités externes analysées ont sensiblement le même rôle que les entités générales, c’est à dire qu’elles permettent d’associer un alias à une information afin de l’utiliser dans le document XML. Mais, dans le cas des entités externes analysées, les informations sont stockées dans un fichier séparé.

La syntaxe

Voyons tout de suite la syntaxe d’une entité externe :

<!ENTITY nom SYSTEM "URI">

Pour utiliser une entité externe dans notre XML, il suffit d’utiliser la syntaxe suivante :

&nom;

Si l’on reprend notre premier exemple, voici ce que cela donne :

<!ENTITY samsung SYSTEM "samsung.xml">
<!ENTITY apple SYSTEM "apple.xml">

<telephone>
  &samsung;
  <modele>Galaxy S3</modele>
</telephone>
<telephone>
  &apple;
  <modele>iPhone 4</modele>
</telephone>

Le contenu des fichiers samsung.xml et apple.xml sera par exemple le suivant :

<!-- Contenu du fichier samsung.xml -->
<marque>Samsung</marque>

<!-- Contenu du fichier apple.xml -->
<marque>Apple</marque>

Au moment de son interprétation, les références aux entités seront remplacées par leurs valeurs respectives, ce qui donne une fois interprété :

<telephone>
  <marque>Samsung</marque>
  <modele>Galaxy S3</modele>
</telephone>
<telephone>
  <marque>Apple</marque>
  <modele>iPhone 4</modele>
</telephone>

En résumé

  • Le mot clef ATTLIST permet d’écrire les règles relatives aux attributs d’une balise.
  • Les entités permettent de jouer les fainéants en réutilisant des éléments qui reviennent souvent dans un document.

Ce cours vous plait ?

Retrouvez ce cours en livre physique sur Amazon !