Developpez.com - XML
X

Choisissez d'abord la catégorieensuite la rubrique :


Créer un document XML valide

Date de publication : à définir

Par Romain Guy (Gfx) (home)
 

Il existe deux types de documents XML: les documents valides et les documents valides bien formés. Nous allons aborder ce mois-ci l'écriture du second type de document.

Introduction
1. Les DTD
2. DTD interne
3. Téléchargement
4. Screenshots


Introduction

Avant tout nous allons faire un rappel des bases concernant l'écriture de documents XML. Tout d'abord, les commentaires se font ainsi:
<!-- commentaire -->
Ensuite, il existe trois types de balises:
Balise de commande: <!COMMANDE >
Balise vide: <tag />
Balise à contenu: <balise>contenu</balise>
Enfin, un document peut faire appel à des entités qui sont des variables contenant des données textuelles. Par exemple:
Affichons le signe inférieur à: &lt;
En utilisant conjointement ces différentes notations, nous allons être en mesure d'écrire un document valide et bien formé. Mais avant de nous lancer dans la réalisation du document proprement dit, nous allons en premier lieu le définir en écrivant sa DTD (Document Type Definition).


1. Les DTD

Une DTD peut être interne ou externe au document XML. Nous allons rédiger une DTD externe que nous étendrons ensuite de manière interne. La DTD que nous allons écrire et qui nous servira d'exemple sera la description d'un fichier contenant un carnet d'adresses. Avant de commencer, il est nécessaire de noter quelles informations devront être répertoriées dans la définition et ce qu'elles contiendront. Notre DTD se trouve dans l'archive .zip jointe avec cet article et se nomme "agenda.dtd". Bien que documentée, nous allons en commenter certaines parties. Pour déclarer une balise comme étant valide, il vous faut taper ceci:
<!ELEMENT balise CONTENU >
CONTENU décrit ce que peux accepter la balise. Vous pouvez mettre EMPTY pour déclarer une balise vide, ANY pour une balise acceptant tout type de contenu, (#PCDATA) pour une balise acceptant du texte ou enfin une liste de balises que pourra contenir celle-ci. Les balises doivent êtres citées entre parenthèses, séparées par une virgule (auquel cas l'ordre de description doit être impérativement respecté) ou par une barre '|' (l'ordre n'importe plus):
<!ELEMENT balise (balise1, balise2) >
Dans une telle définition, #PCDATA peut remplacer le nom d'une balise, la balise est alors dite mixte et son contenu doit être du type: (#PCDATA | balise1 | ...)*.Ici l'odre balise1/balise2 doit être respecté. Il est possible de contrôler le nombre d'apparition d'une sous-balise dans une balise. Pour cela, il faut faire suivre le nom de la balise par un des caractères suivants: ? * +. Par défaut, une sous-balise doit apparaître une et une seule fois. "?" signifie que l'élément peut apparaître zéro ou une fois, "*" que l'élément peut apparaître zéro, une ou plusieures fois et "+" que l'élément doit apparaître une ou plusieures fois. Il est possible d'attribuer ces modificateurs à des groupes de balises en utilisant les parenthèses. Voici un exemple:
<!ELEMENT balise (balise1+ | (balise2, balise3)*) >
balise1 doit apparaître une ou plusieures fois avant toute autre balise. Par contre, balise2 et balise3 doivent apparaître dans cet ordre un nombre indéterminé de fois et ensembles (le modificateur s'appliquant au groupe en entier). A noter que vous pouvez placer balise1 avant ou après un groupe balise2/balise3 (opérateur "|"). Bien entendu, toute balise déclarée dans la liste de contenu d'une autre balise doit elle même être définie dans la DTD. Ainsi:
<!ELEMENT contact (note, adresse+, telephone+, anniversaire?, categorie? ) >
Définit une balise "contact" contenant obligatoirement une et une seule note, au moins une adresse et un numéro de téléphone, une date d'anniversaire ou non et une catégorie ou non. De part la présence des virgules, l'ordre des éléments doit être respecté.
Vous avez pu remarquer qu'une balise peut contenir des attributs. Par exemple dans la balise:
<a href="">
"href" est appelé un attribut de la balise "a". Il est possible de déclarer ses propres attributs de balise dans une DTD en utilisant la syntaxe suivante:
<!ATTLIST balise attribut1 TYPE #MODIF
                              attribut2 TYPE #MODIF >
Ici deux attributs seront déclarés. Il existe différents TYPE d'attributs. Le plus courant est CDATA qui demande une valeur textuelle. On rencontre aussi ENTITY qui prend comme valeur le nom d'une entité externe à XML (fichier image...), NMTOKEN qui fonctionne comme une variable et une liste de choix sous la forme (choix1 | choix2 | ...). Il existe quatre MODIF différents: la valeur par défaut de l'attribut, #REQUIRED qui oblige de donner une valeur à l'attribut, #IMPLIED qui rend un attribut optionnel et #FIXED "valeur" qui fixe une fois pour toute la valeur de l'attribut. Voici un exemple de choix:
<!ATTLIST parser check (yes | no) "yes" >
L'attribut "check" de la balise "parser" accepte "yes" ou "no" comme valeurs sachant que par défaut, "yes" est choisi. Un tel attribut est également #IMPLIED puisqu'il n'est pas nécessaire de l'écrire. Dans l'exemple de notre DTD, la séquence:
<!ELEMENT categorie EMPTY >
  <!ATTLIST categorie nom CDATA #REQUIRED >
Définit donc un élément "categorie" ne pouvant contenir aucune donnée, d'aucune sorte. Cette même balise accepte un seul paramètre obligatoire, contenant du texte, nommé "nom". Comme vous pouvez le constater il est extrêmement aisé de définir de manière rigoureuse un document structuré. Le grand avantage des DTD est qu'elles évitent au programmeur de gérer les erreurs de syntaxe car c'est le parser qui s'en charge lui même. De plus, l'utilisateur est sûr de ne commettre aucune erreur de rédaction si il prend la précaution de valider son document au préalable.


2. DTD interne

Maintenant que notre DTD est écrite, nous allons concevoir un document en faisant usage, en respectant les règles que nous avons édictées. Commençons par désigner de quelle DTD le document dépend (fichier "MesContacts.xml" dans l'archive):
<!DOCTYPE agenda SYSTEM "agenda.dtd" >
La commande "!DOCTYPE" possède deux syntaxes pouvant être mélangées:
<!DOCTYPE baliseMère SYSTEM "dtdExterne.dtd [
<!-- définition de la dtd -->
]>
"baliseMère" nomme la balise qui contiendra toutes les autres dans le documents (pour les fichiers HTML, cette balise est "HTML"). La déclaration "SYSTEM 'dtd.dtd'" permet d'inclure un DTD définie dans une fichier externe. Enfin, les déclarations entre crochets feront partie de la DTD. Il est possible d'utiliser l'une ou l'autre des déclarations (SYSTEM ou []), voir les deux. Nous allons nous même faire usage des deux types. Pourquoi cela ? Imaginons que notre liste de contacts contiennent plusieures personnes possédant le même prénom. On pourrait se fatiguer à l'écrire à chaque fois, mais il y a plus simple. En effet, en utilisant la commande "ENTITY" nous allons définir notre nom sous forme d'entité réutilisable. Comme une telle déclaration fait partie de la DTD mais que cette déclaration n'est pas générique à toutes les listes de contacts possibles, nous allons l'inclure dans la DTD interne au document. Voici comment nous procédons:
<!DOCTYPE agenda SYSTEM "agenda.dtd" [
  <!ENTITY ro "Romain">
]>
Que dit cette balise "!DOCTYPE" ? Tout simplement que le document XML est inclus dans la balise <agenda>, qu'il dépend de la DTD du ifchier "agenda.dtd" et que l'entité ro doit être convertie en "Romain". Ici nous nous contentons l'adjonction d'une simple entité. Mais il est possible d'ajouter des attributs aux balises, de définir de nouvelles balises ou encore de surcharger (redéfinir) des balises. Une fois votre définition de type de document et votre document écrits, il ne vous reste plus qu'à utiliser un outil de validation pour en vérifier l'exactitude. Un outil simple et pratique est Xplorer disponible sur le site Internet d'AlphaWorks () ou dans l'archive jointe à l'article. Cet outil ne vous affichera le contenu du fichier XML sélectionné que si sa validité est prouvée. Pour vous familiariser un peu plus avec les DTD et documents XML, vous pouvez consulter dans l'archive, dans le répertoire "autres" de cet article les différentes DTD et leurs exemples associés. L'exemple le plus intéressant est "xproperties-exemple.xml" qui fait usage d'une DTD externe et d'une interne pour inclure d'autres fichiers XML via des entités.
Rassurez-vous, nous en avons fini avec la théorie et nous pourrons dès le mois prochain apprendre à utiliser XML avec Java et enfin, enfin, retourner à la programmation !


3. Téléchargement

Voici les sources de l'article : ici


4. Screenshots

Xplorons le monde fantastique de XML
Xplorons le monde fantastique de XML

Le document est validé !
Le document est validé !


Valid XHTML 1.1!Valid CSS!

Cette création est mise à disposition sous un contrat Creative Commons (Paternité - Partage des Conditions Initiales à l'Identique).
Responsable bénévole de la rubrique XML : Didier Mouronval -