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 :
- DTD (Document Type Definition) : définition du type de document. Ce langage peut être inclu directement dans le document XML.
- XML Schema : il permet de définir la structure d’un document avec plus de précision (type de donnée, nombre d’occurence, …).
- Relax NG (REgular LAnguage for XML Next Generation) : ce langage ne spécifie que la structure du document, le type de donnée est sous-traitée à la bibliothèque de types de XML Schema.
- Schematron : contrairement aux autres langages Schematron définie un modèle d’arbre du document XML, il utilise la même conception que XPath ou XSLT.
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 :
- ELEMENT : représente un élément XML et permet de définir les sous-éléments ansi que leurs occurences.
- ATTLIST : liste des attributs d’un élément.
- ENTITY : permet de définir un ‘alias’.
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 :
- (#PCDATA) : l’élément contient des données de types textes mais ne peut pas contenir de sous-éléments.
- (Element1, Element2, …) : liste des sous-éléments que contient l’élément.
-
**(Element1 Element2 …)** : liste des sous-éléments qui peuvent être contenus par cet élément. - ANY : cet élément peut contenir n’importe quel type de données.
- EMPTY : cet élément doit être vide et ne peux contenir aucune donnée (texte ou éléments).
Dans la définition des sous-éléments on peut spécifier l’occurence de l’élément :
- Element1? : l’élément peut apparaître 0 ou 1 fois.
- Element1+ : l’élément peut apparaître 1 ou plusieurs fois.
- Element1* : l’élément peut apparaître 0, 1 ou plusieurs fois.
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 :
- CDATA : l’attribut contient des données textuelles.
- ID : chaqu’un des éléments définis doit avoir une valeur différente pour cet attribut.
- IDREF **: référence la valeur d’un attribut **ID d’un autre élémént.
- IDREFS **: liste d’attributs **ID, ses valeurs sont séparées par un espace.
- **ENTITY **: correspond à une ENTITY déclarée dans la DTD.
- **ENTITIES **: listes d’ENTITY déclarées dans la DTD, chaque ENTITY doit être séparées par un espace.
- **NMTOKEN **: la valeur doit être un nom XML valide.
- **NMTOKENS **: liste de noms XML valides.
- NOTATION : nom d’une notation définie dans la DTD.
La valeur par défaut de l’attribut peut prendre les valeurs suivantes :
- valeur : valeur par défaut de l’attribut.
- #REQUIRED : l’élément doit forcément posséder cet attribut.
- #IMPLIED : cet attribut n’est pas obligatoire.
- #FIXED valeur : l’attribut doit forcément avoir la valeur valeur.
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é.