Validation XML

January 3, 2008

Lors de l’utilisation du langage XML on voudrait que tous les documents que l’on va parser soit valide, c’est à dire qu’ils correspondent à un certain format. Cependant si l’utilisateur a accés à ces documents XML il faut pouvoir vérifier que le document est valide.
On peut réaliser cette vérification pendant le parsing mais cela ajoute une tâche au développeur.

C’est pour cela qu’il existe des langages de validations, ils permettent de valider le format des documents XML selon un format qui est défini par le dévéloppeur.

La plupart des parseurs vérifient le format et renvoient une erreur si le format n’est pas respecté.

Les langages de validations

Il existe plusieurs langages de validations, mais je ne vais vous présenter que les deux les plus utilisés.

Les différents langages :

Doctype

Une DTD est une grammaire permettant de vérifier la validité d’un document.
Un document XML peut avoir une DTD incluse dans son entête ou bien indiquée le fichier où elle se situe.

Une DTD définit trois objets permettant de définir la grammaire :

Une DTD est définie de la façon suivante :

<!DOCTYPE element-racine [
  <!ELEMENT ...>
  <!ATTLIST ...>
  <!ENTITY ...>
]>

Voici un site permettant de valider un fichier XML avec sa DTD : http://www.xmlvalidation.com/.

Élément

Permet de définir un élément XML en spécifiant le nom les sous-éléments de ce dernier.
La déclaration d’un ENTITY doit avoir la syntaxe suivante :

<!ELEMENT nom (Donnees)>

La définition des Donnees peut avoir les valeurs suivantes :

Dans la définition des sous-éléments on peut spécifier l’occurence de l’élément :

On peut spécifier le nombre de sous-élément en répétant l’élément enfant :

<!ELEMENT element1 (element2, element2)>

Ici l’ “élément1″ devra forcément contenir 2 éléments “element2″.

Voici un exemple de DTD d’une liste de contacts :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE contacts [
  <!ELEMENT contacts (contact*)>
  <!ELEMENT contact (nom, adresse, mail)>
  <!ELEMENT nom (#PCDATA)>
  <!ELEMENT adresse (#PCDATA)>
  <!ELEMENT mail (#PCDATA)>
]>
<contacts>
  <contact>
    <nom>Marwan KHELIF</nom>
      <adresse>...</adresse>
      <mail>[email protected]</mail>
    </contact>
  <contact>
      <nom>My Name</nom>
      <adresse>My address</adresse>
      <mail>[email protected]</mail>
    </contact>
  </contacts>
</code>

Attlist

La déclaration ATTLIST permet de définir les attributs d’un élément. On peut spécifier le type de donnée, la valeur par défaut, forcer la présence de l’élément, …

La déclaration se fait ainsi :

<!ATTLIST nomElement nomAttribut Type ValeurDefaut>

Le nom de l’élément doit correspondre au nom d’un élément déclaré dans la DTD.

Le type de l’attribut peut prendre les valeurs suivantes :

La valeur par défaut de l’attribut peut prendre les valeurs suivantes :

Voilà un exemple de DTD définissant des attributs :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE personnes [
  <!ELEMENT personnes (personne*)>
  <!ELEMENT personne (adresse, mail)>
  <!ATTLIST personne
       id ID #REQUIRED
       nom CDATA #REQUIRED
       sexe (homme | femme) "homme">
<!ELEMENT adresse (#PCDATA)>
  <!ATTLIST adresse
       code CDATA #REQUIRED>
<!ELEMENT mail (#PCDATA)> ]>
<personnes>
  <personne id="user0" nom="Marwan KHELIF">
    <adresse code="13">...</adresse>
    <mail>[email protected]</mail>
  </personne>
  <personne id="user1" nom="MyName" sexe="femme">
    <adresse code="01">...</adresse>
    <mail>[email protected]</mail>
  </personne>
</personnes>

Entity

La déclaration d’une ENTITY permet de créer un ‘alias’, elle est ensuite utilisable dans le document XML.

On la déclare de la façon suivante :

<!ENTITY nomEntity "valeur">

On peut alors l’utiliser dans le document XML : &nomEntity;, la valeur définie sera alors positionnée à la place de cet entité.

Par exemple :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE articles [   <!ENTITY auteur "Marwan KHELIF">
  <!ENTITY dtd "Document Type Definition">
  <!ENTITY xsd "XML Schema">
<!ELEMENT articles (article*)>
<!ELEMENT article (#PCDATA)>
  <!ATTLIST article
       titre CDATA #REQUIRED
       auteur CDATA "&auteur;"
       date CDATA #REQUIRED>
]>
<articles>
  <article titre="&dtd;" date="17/07/07">Presentation de &dtd; par &auteur;.</article>
  <article titre="&xsd;" date="17/07/07">Presentation de &xsd; par &auteur;.</article>
</articles>

Ce sont les entités générales du document, il y a un autre type d’entités : les entités paramètes.
Elles sont définies de la même manière sauf qu’il faut rajouter un ‘%‘ devant le nom :

<!ENTITY % nomEntity "valeur">

On les utilise de la façon suivante : %nomEntity;.
Voilà un exemple de leur utilisation :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE articles [
  <!ENTITY % article "titre, auteur, date, contenu">
<!ENTITY auteur "Marwan KHELIF">
  <!ENTITY dtd "Document Type Definition">
  <!ENTITY xsd "XML Schema">
<!ELEMENT articles (article*)>
  <!ELEMENT article (%article;)>
  <!ELEMENT titre (#PCDATA)>
  <!ELEMENT auteur (#PCDATA)>
  <!ELEMENT date (#PCDATA)>
  <!ELEMENT contenu (#PCDATA)>
]>
<articles>
  <article>
    <titre>&dtd;</titre>
    <auteur>&auteur;</auteur>
    <date>17/07/07</date>
    <contenu>Presentation de &dtd; par &auteur;.</contenu>
  </article>
  <article>
    <titre>&xsd;</titre>
    <auteur>&auteur;</auteur>
    <date>17/07/07</date>
    <contenu>Presentation de &xsd; par &auteur;.</contenu>
  </article>
</articles>

Ces deux types d’entités sont internes au document XML, on peut indiquer que la cible de l’entité est un fichier externe au document :

<!ENTITY doc SYSTEM "http//www.mkhelif.fr/doc.xml">
&doc;
<!ENTITY % articles SYSTEM "articles.dtd">
%articles;

Lors de l’utilisation de l’entité le contenu du fichier sera chargé et remplacera l’entité.