slam:donneestructurees:le_format_xml_2

Voir cette page sous forme de diaporama.

Le XML (2) – Validité de documents

Un fichier XML doit non seulement respecter des règles d'écriture vues précédemment(document bien formé) ; il peut aussi, si on le désire, suivre des règles strictes d'enchâssements des éléments. Il existe deux grands langages de description pour ce faire : la DTD et le Schema XML.

Préciser les balises et attributs auxquels on a droit lors de la rédaction d'un document XML peut être utile, voire indispensable, si l'on veut pouvoir partager le même type de document avec une communauté d'autres rédacteurs. 

On peut alors tester la validité des documents faisant référence à une DTD pour s'assurer qu'ils respectent bien les règles qui y sont mentionnées. Un document bien formé dont la syntaxe est conforme aux règles stipulées dans une DTD ou un Schema XML est dit valide.

Cette déclaration, lorsqu'elle est présente, permet de définir la structure du document. Elle peut être de deux types, externe ou interne.

Exemple de déclaration de type de document :

  • <!DOCTYPE biblio SYSTEM “biblio.dtd”>

Ce type de déclaration est celui d'une déclaration de type de document. Elle définit l'ensemble des éléments utilisables dans le document, y compris l'élément-racine (ici biblio) ainsi que l'emplacement où se trouve le fichier biblio.dtd dans lequel se trouve définie la structure du document.

Cette déclaration se place juste après le prologue du document.

Bien que facultative, il est souvent très intéressant de posséder une DTD, en particulier externe, simplement pour vérifier la validité du document XML. Il est ainsi recommandé d'en utiliser une dans le cas du développement parallèle de plusieurs fichiers XML destinés à subir un traitement particulier (développement par plusieurs personnes par exemple).

L'autre type de document permettant de définir la structure d'un fichier, le schéma XML, s'utilise autrement, comme nous le verrons plus tard.

Le contenu ne change pas suivant le type de DTD, mais les déclarations d'une DTD interne sont écrites à l'intérieur du document XML alors que celles d'une DTD externe sont stockées dans un fichier… externe.

<!DOCTYPE biblio [
<!ELEMENT biblio (livre*) >
<!ELEMENT livre (titre, auteur, nb_tomes) >
<!ELEMENT titre (#PCDATA) >
<!ELEMENT auteur (#PCDATA) >
<!ELEMENT nb_tomes (#PCDATA) >
]>

Les deux types de DTD externes sont les DTD de type public et les DTD de type system. Le mot-clef SYSTEM indique que le fichier spécifié se trouve sur l'ordinateur local et qu'il est disponible uniquement à titre privé. Le mot-clé PUBLIC indique une ressource disponible pour tous sur un serveur distant.

  • 1) Exemple de déclaration de DTD externe de type SYSTEM :
<!DOCTYPE biblio SYSTEM "bibliographie.dtd">
Le fichier associé est le suivant :
<!ELEMENT biblio (livre*) >
<!ELEMENT livre (titre, auteur, nb_tomes) >
<!ELEMENT titre (#PCDATA) >
<!ELEMENT auteur (#PCDATA) >
<!ELEMENT nb_tomes (#PCDATA) >
  • 2) Exemple de déclaration de DTD externe de type PUBLIC  :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Dans l'exemple précédent, la chaîne de caractères après le mot PUBLIC fait référence tout d'abord à l'identifiant de la DTD (ici -, qui signifie que la DTD n'a pas de numéro d'enregistrement officiel), au propriétaire de la DTD (ici le W3C), puis son nom, enfin sa langue.

A vous de jouer(3)-tester ces 2 manières de lier un fichier XML à sa DTD avec le fichier biblio.xml créé précédemment

Déclarations d'éléments

Une déclaration d'élément est de la forme (toujours un espace après le nom de l’élément) :

<!ELEMENT nom type_element >

  • nom est le nom de l'élément
  • type_element est le type auquel il est associé. Un élément peut être de type texte, vide, séquence ou choix d'élément. Dans ces deux derniers cas, on indique la liste des éléments-enfants.

Passons ces types en revue.

Cet élément est le plus répandu, puisque c'est celui qui contient… du texte. Il se déclare ainsi :

<!ELEMENT elt (#PCDATA) >

Un élément vide est, comme son nom l'indique, un élément qui n'a aucun contenu -que ce soit de type texte, ou bien un autre élément. Le mot-clef utilisé pour la déclaration de ce type d'élément est EMPTY :

<!ELEMENT elt EMPTY >

Exemple d'utilisation : <elt />

Un élément vide peut cependant fort bien posséder un ou plusieurs attributs.

Par exemple : <img width=“100” height=“30” src=“paysage.jpg” alt=“Paysage de neige” />

Une séquence d'éléments est une liste ordonnée des éléments qui doivent apparaître en tant qu'éléments-enfants de l'élément que l'on est en train de définir. Ce dernier ne pourra contenir aucun autre élément que ceux figurant dans la séquence. Cette liste est composée d'éléments séparés par des virgules et est placée entre parenthèses.

Chaque élément-enfant doit de plus être déclaré par ailleurs dans la DTD (avant ou après la définition de la liste, peu importe). Dans le fichier XML, ils doivent apparaître dans l'ordre de la séquence.

<!ELEMENT elt0 (elt1, elt2, elt3) >

Exemple d'utilisation valide de cette déclaration :

<elt0>
  	<elt1>(...)</elt1>
  	<elt2>(...)</elt2>
  	<elt3>(...)</elt3>
</elt0>

Exemples d'utilisations non valides :

<elt0>
   <elt1>(...)</elt1>
   <elt3>(...)</elt3>
</elt0>

… car l'élément elt2 est manquant.

<elt0>
  <elt1>(...)</elt1>
  <elt3>(...)</elt3>
  <elt2>(...)</elt2>
</elt0>

… car l'ordre des éléments n'est pas respecté.

Un choix d'élément donne le choix dans une liste de plusieurs éléments possibles. L'utilisation précise dépend des indicateurs d'occurrence, que nous verrons un peu plus loin. De même que pour la séquence, les éléments-enfants doivent être déclarés dans la DTD. Cette liste est composée d'éléments séparés par le caractère | (combinaison de touches AltGr+6 sur un clavier AZERTY).

<!ELEMENT elt0 (elt1 | elt2 | elt3) >

Exemple d'utilisation valide :

<elt0> <elt2>(...)</elt2> </elt0>

Exemple d'utilisation non valide :

<elt0>
  	<elt2>(...)</elt2>
  	<elt3>(...)</elt3>
</elt0>

Lors de la déclaration de séquence ou de choix d'éléments, à chaque élément enfant peut être attribuée une indication d’occurrence : ?+ ou *.

Exemples d'indicateur d'occurrences (pas d’espace entre l’élément et son indicateur) :

<!ELEMENT elt0 (elt1, elt2?, elt3+, elt*) >
  • elt1 ne comprend aucune indication . Il doit donc apparaître une seule et unique fois dans l'élément elt0 ;
  • elt2 a pour indication d’occurrence ?. Cela signifie que l'élément doit apparaître au maximum une fois (il peut ne pas apparaître du tout) ;
  • elt3 a pour indication d’occurrence+. Cela signifie que l'élément doit apparaître au moins une fois ;
  • elt4 a pour indication d’occurrence*. Cela signifie que l'élément peut apparaître autant de fois que l'auteur le désire, voire pas du tout.

Les indicateurs d’occurrence peuvent être utilisés en conjonction avec les séquences ou les choix d'éléments. Ainsi…

<!ELEMENT elt0 (elt1+, elt2*, elt3?) >

… permet d'indiquer une séquence composée d'au moins un élément elt1, puis d'un nombre indéterminé d'éléments elt2 (éventuellement nul), enfin au plus un élément elt3.

Exemple d'utilisation d'un choix d'éléments avec indicateurs d’occurrence par élément :

<!ELEMENT choix.elt (elt1* | elt2* | elt3*) >

Exemple d'utilisation valide :

<elt0>
  	<elt2>(...)</elt2>
  	<elt2>(...)</elt2>
</elt0>

Exemples d'utilisation non valide :

<elt0>
  	<elt3>(...)</elt3>
  	<elt2>(...)</elt2>
</elt0>
<elt0>
  	<elt2>(...)</elt2>
  	<elt3>(...)</elt3>
</elt0>

Exemple d'utilisation d'un choix d'éléments avec indicateur d'occurrence global :

<!ELEMENT elt0 (elt1 | elt2 | elt3)* >

Exemple d'utilisation valide :

<elt0>
  <elt2>(...)</elt2>
  <elt3>(...)</elt3>
  <elt1>(...)</elt1>
</elt0>

Dans ce dernier cas, il n'y a pas de contrainte visible sur l'ordre d'apparition et le nombre des éléments. C'est la déclaration la plus souple possible.

L'élément quelconque est l'élément-« fourre-tout » dans une DTD. Il peut contenir tout autre élément défini dans la DTD, aussi bien qu'être vide ou contenir du texte. Les éléments-enfants éventuels peuvent apparaître dans n'importe quel ordre, et en quantité non définie.

Il est préférable de ne pas utiliser trop souvent ce type de déclaration, car on perd les avantages qu'offre la rédaction d'une DTD, qui sont de fixer des contraintes précises sur la structure du document XML qui lui est lié.

Le mot-clef utilisé pour la déclaration de ce type d'élément est ANY.

<!ELEMENT elt ANY >

Un élément à contenu mixte peut contenir aussi bien du texte que des éléments-enfants. Il se présente comme une liste de choix, avec des indicateurs d’occurrence bien choisis. Le texte contenu peut se trouver à n'importe quel endroit dans l'élément, et peut être une section CDATA .

Exemple de déclaration : <!ELEMENT citation (#PCDATA | auteur)* >

Exemple d'utilisation :

<citation>
  	<auteur>Shakespeare</auteur>Être ou ne pas être
</citation>

La seule syntaxe possible dans la déclaration commence par #PCDATA.

Pour reprendre l'exemple précédent, écrire <!ELEMENT citation (auteur|#PCADATA)*> est incorrect.

A vous de jouer(4) Rédiger une DTD pour le fichier xml bibliographie. Cette bibliographie :

 • contient des livres et des articles ;
 • les informations nécessaires pour un livre sont :
      ◦ son titre général ;
      ◦ les noms du ou des auteurs(au moins 1) ;
      ◦ son nombre de tomes
      ◦ pour chaque tome, son numéro et son nombre de pages ;
      ◦ des informations générales sur son édition comme par exemple le nom de l'éditeur et son numéro ISBN ;
  • les informations nécessaires pour un article sont :
      ◦ son titre ;
      ◦ les noms du ou des auteurs(certains articles peuvent être anonymes) ;
      ◦ ses références de publication : nom du journal, numéro des pages, année de publication et numéro du journal
  • on réservera aussi un champ optionnel pour un avis personnel.

Tester cette DTD avec un fichier XML que vous écrirez (inventer des valeurs) et validerez :

  1. xmlvalidation.com avec DTD interne – en ligne; XMLSpy -version essai 30j-windows
  2. fiche de tests papier

Comme on peut trouver dans un document XML des éléments possédant des attributs, il est normal que la DTD permette de définir des contraintes sur ces derniers. On peut déclarer et attacher à un élément donné chaque attribut séparément, mais il est souvent préférable, afin d'améliorer la lisibilité du code, de les réunir sous la forme d'une liste. Chaque attribut défini dans la liste possède un nom et un type. On peut lui donner une valeur par défaut, ou bien indiquer qu’il est obligatoire.

Le mot-clef de cette déclaration est ATTLIST.

Il s'agit là du type d'attribut le plus courant. Une chaîne de caractères peut être composée de caractères ainsi que d'entités analysables. Le mot-clef utilisé pour la déclaration de chaîne de caractère est CDATA.

Exemple de déclaration de CDATA (nous reviendrons dans un instant sur la signification du mot-clef #IMPLIED) :

<!ELEMENT elt (...) >
  	<!ATTLIST elt attr CDATA #IMPLIED >

Exemples d'utilisations :

<elt attr="Chaîne de caractères">(...)</elt>

Chaque attribut peut être obligatoire, optionnel ou fixe et avoir une valeur par défaut. Les exemples suivants montrent la déclaration d'un attribut appelé attr  attaché à un élément nommé elt.

A. Déclaration d'un attribut avec une valeur par défaut :

<!ELEMENT elt (...) >
  	<!ATTLIST elt attr CDATA "valeur" >

Un tel attribut n'est pas obligatoire. S'il est omis dans le fichier XML lors de l'utilisation de l'élément elt, il est considéré comme valant valeur. Dans cet exemple, si on écrit <elt>(…)</elt>, cela est équivalent à écrire <elt attr=“valeur”>(…)>/elt>.

B. Déclaration d'un attribut requis :

<!ELEMENT elt (...) >
  <!ATTLIST elt attr CDATA #REQUIRED >

Un tel attribut est obligatoire. Son absence déclenche une erreur du vérificateur syntaxique sur le fichier XML.

C. Déclaration d'un attribut optionnel :

<!ELEMENT elt (...) >
  <!ATTLIST elt attr CDATA #IMPLIED >

D. Déclaration d'un attribut avec une valeur fixe :

<!ELEMENT elt (...) >
  <!ATTLIST elt attr CDATA #FIXED "valeur" >

L'utilité d'un tel attribut peut sembler bizarre à première vue, puisqu'il ne peut prendre qu'une seule valeur. Cette fonctionnalité est cependant utile lors d'une mise à jour d'une DTD, pour anticiper la compatibilité avec des versions ultérieures.

Ce type sert à indiquer que l'attribut en question peut servir d'identifiant dans le fichier XML. Deux éléments ne pourront pas posséder le même attribut avec la même valeur.

Exemple de déclaration de type ID optionnel :

<!ELEMENT elt (...) >
  	<!ATTLIST elt attr ID #IMPLIED >
<!ELEMENT elt1 (...) >
  	<!ATTLIST elt1 attr ID #IMPLIED >
<!ELEMENT elt2 (...) >
  	<!ATTLIST elt2 attr ID #IMPLIED >

La déclaration précédente interdit par exemple…

<elt1 attr="machin"> </elt1>
<elt2 attr="truc"> </elt2>
<elt1 attr="machin"> </elt1>
... ainsi que
<elt1 attr="machin"> </elt1>
<elt2 attr="machin"> </elt2>
<elt1 attr="truc"> </elt1>

C’est par exemple le cas de l’attribut id en (X)HTML.

Ce type est complété par le type IDREFS. Un attribut de type IDREFS contiendra une liste d’ID. Par exemple, si dans le document XML ont été utilisés des attributs de type ID valant machin, vacheÀLait et ChemiseÀFleurs, alors une valeur valide pour un attribut de type IDREFS sera “machin vacheÀLait ChemiseÀFleurs”. L’attribut headers des éléments td en (X)HTML est de type IDREFS.

On peut parfois désirer limiter la liste de valeurs possibles pour un attribut. On le définit alors comme étant de type énuméré. Donner une autre valeur dans le fichier XML provoque une erreur.

Exemple de déclaration d'une liste de choix d'attributs :

<!ELEMENT img EMPTY >
  <!ATTLIST img format (GIF | JPEG | PNG) "PNG" >

Cet exemple déclare un attribut format d'un élément img. La valeur de cet attribut peut être PNG, GIF ou JPEG. Si aucune valeur n'est affectée à cet attribut, c'est la valeur par défaut qui le sera, ici PNG. On notera l'absence de guillemets dans la liste des valeurs possibles. En ajouter est une erreur courante dans la rédaction d'une DTD.

On utilise le fait qu'il est possible de « factoriser » le nom de l'élément. Par exemple…

<!ELEMENT elt (...) >
  	<!ATTLIST elt
    		attr1 CDATA #IMPLIED
    		attr2 CDATA #REQUIRED
  >

Les retours à la ligne sont optionnels, et la mise en page n’est pas contrainte.

A vous de jouer(4) Modifier la DTD précédente (biblio)…

  • ... en ajoutant un attribut optionnel soustitre à l'élément titre ;
  • ... en faisant de l'élément tome un élément vide et en lui ajoutant un attribut identifiant numTome, un attribut requis nbPages et un attribut optionnel sousTitre ;
  • ... en faisant de l'élément nomJournal un attribut de l'élément journal et en lui donnant comme valeur par défaut Feuille de Chou ;
  • ... en faisant de l'élément annee un attribut de type énuméré, prenant comme valeurs possibles 2021, 2020, 2019, "avant_2019" et "inconnue" et proposant comme valeur par défaut inconnue.

Utiliser cette DTD pour créer un fichier XML valide.

LIMITES DTD :

  1. les DTD ne sont pas au format XML. Cela signifie qu'il est nécessaire d'utiliser un outil spécial pour manipuler un tel fichier, différent de celui utilisé pour l'édition du fichier XML.
  2. les DTD ne supportent pas les « espaces de nom », il n'est pas possible d'importer des définitions de balises définies par ailleurs dans un fichier XML défini par une DTD.
  3. le « typage » des données (c'est-à-dire la possibilité de spécifier par exemple qu'un attribut ne doit être qu'un nombre entier) est extrêmement limité.

Le schéma XML:

  1. Un schéma XML décrit la structure d'un document XML.
  2. Le langage XML Schema est également appelé XML Schema Definition (XSD).
  3. Le but d'un schéma XML est de définir les blocs de construction juridiques d'un document XML :

• Le typage des données est mieux défini, ce qui permet la gestion de booléens, d'entiers, d'intervalles de temps… Il est même possible de créer de nouveaux types à partir de types existants.

  • La notion d'héritage. Les éléments peuvent hériter du contenu et des attributs d'un autre élément.
  • Le support des espaces de nom.
  • Les indicateurs d'occurrences des éléments peuvent être tout nombre non négatif (rappel : dans une DTD, on est limité à 0, 1 ou un nombre infini d'occurrences pour un élément).
  • Les schémas sont très facilement concevables par modules.

Avantages du schéma XML par rapport à la DTD XML Schema est une alternative basée sur XML (et plus puissante) à la DTD.

  • Les schémas XML prennent en charge les types de données plus largement que la DTD.
  • Les schémas XML utilisent la syntaxe XML.
  • une Communication de données sécurisée

Comparaison : Fichier xml à valider :

DTD : Schéma XML :

Référence DTD externe entre le prologue et la racine :

<!DOCTYPE note SYSTEM“https://www.w3schools.com/xml/note.dtd”>

Référence schéma XML externe dans l’élément racine :

<note xmlns=“https://www.w3schools.com” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“https://www.w3schools.com/xml note.xsd”>

  • slam/donneestructurees/le_format_xml_2.txt
  • Dernière modification : 2025/01/09 14:12
  • de dthevenot