Petit point sur le XML

Publié dans XML | Marqué avec , , , ,
Share

Voilà quelques temps déjà que je veux faire un petit point sur le XML. Une sorte d’aperçu théorique et un peu pratique permettant d’aller plus loin avec ce langage tellement utilisé aujourd’hui. Ce jour semble être venu ! (tintindindin !) Tout du moins en partie, puisqu’aujourd’hui, je parlerai du XML, de la bonne formation d’un fichier XML et de sa validité.

Présentation rapide d’XML

XML, qu’est-ce que c’est ? C’est un langage d’échange basé sur le balisage. Peu après sa création en 1996 (ça date quand même), il remplace le SGML qui était un peu plus compliqué, et c’est aujourd’hui un méta-langage universel pour les données sur le Web, surtout depuis que le W3C s’est chargé de le standardiser.
Bref, on peut mettre des données dans un fichier XML, et grâce à différentes techniques on est capable de les récupérer, les traiter, les afficher, ajouter des données au fichier… faire des trucs un peu cool dessus ! On s’en sert pour les flux RSS et Atom, pour l’Ajax, on peut l’utiliser comme base de données en PHP et je sais aussi qu’OpenOffice s’en sert pour le format de ses fichiers (.odt, tout ça). C’est utile et utilisé !

Un fichier XML bien formé

Un fichier XML est bien formé lorsqu’il respecte la syntaxe d’XML. Pour vérifier qu’un fichier XML est bien formé, on peut utiliser le validateur de la W3schools. Et d’ailleurs, pour apprendre à créer un fichier XML bien formé, on peut utiliser le tutoriel de la W3schools : Tutoriel XML W3schools.
Exemple de fichier XML bien formé :

<?xml version="1.0" encoding="ISO-8859-1"
<blog>
	<nom>30 minutes par jour</nom>
	<description langue="fr">Un blog qui cause d'informatique 30 minutes tous les jours (ou presque)</description>
	<url type="internet">http://30minparjour.la-bnbox.fr/</url>
	<billets>
		<billet>
			<titre langue="fr">Petit point sur le XML</titre>
		</billet>
		<billet>
			<titre langue="fr">En ce début d'année, faisant le point</titre>
		</billet>
	</billets>
</blog>

Voici un résumé de cette syntaxe :

  • Un document a un prologue (), un élément racine (blog)
  • Un élément est composé : d’un nom qui détermine son type (nom, description, url, billets, billet, titre), d’attributs optionnels (langue, type), d’un contenu vide (balise simple ou double ) ou non (balise double contenu pouvant contenir des balises).
  • Un contenu est une chaine de caractères. S’il contient des délimiteurs XML (<, >, &, ', "), il faut les transformer en caractères ASCII (<, >, &, ', " ou plutôt <, >, &, ', "), ou inclure le contenu dans une section CDATA. Exemple : <![CDATA[contenu]]>
  • Un attribut a un nom et une valeur qui est une chaine de caractères. Exemple : langue="fr"
  • Chaque élément est marqué par une paire de balises ouvrante et fermante. Balise double ou simple

Voilà pour notre petit résumé.

Un fichier XML valide

Il est possible de préciser une méta-description à un fichier XML, c'est-à-dire un modèle, une suite de règles que le document XML doit suivre, afin de s'assurer qu'un fichier XML est valide suivant ce que l'on veut faire. Par exemple (si j'ai bien capté), quelqu'un a un jour créé une méta-description du XML pour créer le XHTML : un arbre XML qui respecte en plus certaines autres règles. Un autre exemple sont les flux RSS...

Il existe 2 méthodes pour définir un modèle :

  • DTD (Document Type Definition) : décrit un document relativement facilement et rapidement, mais peu de contraintes sur les types
  • Schéma XML (XSD) : système très évolué avec un typage fort, une syntaxe XML et orienté échange de données

Introduction au DTD

Il existe deux manières d'utiliser une DTD :

  • Soit en créant un fichier .dtd et en l'assignant au fichier XML en utilisant la balise
  • Soit en l'incorporant directement directement dans le fichier XML en utilisant la balise

Exemple de DTD incorporée dans le fichier XML de l'exemple précédent :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE blog_dtd [<!ELEMENT blogs (blog*)>
<!ELEMENT blog (nom, description, url, billets)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ATTLIST description langue (fr|en|it) "fr">
<!ELEMENT url (#PCDATA)>
<!ELEMENT billets (billet*)>
<!ELEMENT billet (titre)>
<!ELEMENT titre (#PCDATA)>
<!ATTLIST titre langue (fr|en|it) "fr"> ]> 
<blog>
	<nom>30 minutes par jour</nom>
	<description langue="fr">Un blog qui cause d'informatique 30 minutes tous les jours (ou presque)</description>
	<url type="internet">http://30minparjour.la-bnbox.fr/</url>
	<billets>
		<billet>
			<titre langue="fr">Petit point sur le XML</titre>
		</billet>
		<billet>
			<titre langue="fr">En ce début d'année, faisant le point</titre>
		</billet>
	</billets>
</blog>

Pour résumé rapidement comment construire un élément :

  • Élément contenant d'autres éléments : <!ELEMENT nom_element (sous_element1, sous_element2, (sous_element3|ou_sous_element4), ...)> Il est possible d'utiliser + (1 fois ou plus),
  • (0 fois ou plus) pour définir combien de fois peuvent apparaître les sous éléments.
  • Élément vide (balise simple) : <!ELEMENT nom_element EMPTY>
  • Élément contenant une données : <!ELEMENT nom_element (#PCDATA)> ou des données précises : <!ELEMENT nom_element (hello world|bonjour le monde|salut !)>

Et pour les attributs :

  • De manière générale : <!ATTLIST nom_element nom_attribut type_attribut valeur_par_defaut>
  • Une valeur par défaut : <!ATTLIST nom_element nom_attribut CDATA "valeur">
  • Une valeur obligatoire : <!ATTLIST nom_element nom_attribut CDATA #REQUIRED>
  • Une valeur facultative : <!ATTLIST nom_element nom_attribut CDATA #IMPLIED> c'est le mode par défaut
  • Une valeur non modifiable, il faut donc forcément définir une valeur par défaut : <!ATTLIST nom_element nom_attribut CDATA #FIXED "valeur">
  • Énumération de valeur, dont une par défaut : <!ATTLIST nom_element nom_attribut (val1|val2|val3) "val1">

La encore, le plus simple est de lire le tutoriel de la W3Schools sur les DTD. Et voici un petit validateur de DTD.

Introduction aux schémas XML (XSD)

Créer un schéma XML est légèrement plus délicat que de faire une DTD, mais cela permet d'en préciser entièrement la structure et le contenu. En somme il faut un petit peu s'accrocher pour maitriser la syntaxe, mais c'est pour mieux structurer mon enfant.
Pas de mémo cette fois-ci, il y a trop de choses à dire pour cela, d'autant plus que tout est très bien expliqué sur... W3Schools ! Et voici un validateur pour tester le résultat.

Pour conclure

Voilà un bon début pour parler du XML : un fichier bien formé et valide. Avec ça, on comprend mieux l'utilité de cette fichue ligne que l'on trouve sur tous nos codes XHTML :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Et on peut aussi comprendre qu'il existe un standard pour les flux RSS (défini au travers d'une DTD ou d'un schéma XML ? Ou autre chose puisqu'il n'y a pas de DOCTYPE dans un fichier RSS... Aucune idée).
Bref, ça ouvre l'esprit.
Pour aller plus, il est aussi possible de définir grâce au langage XSL (comprenant XSLT, XPath et XSL-FO) la manière d'afficher un fichier XML. Ce sera peut-être pour une autre fois...

3 réponses à Petit point sur le XML

  1. grosdim

    Salut, Article très bien écrit. Mais étant donné que le XML Schéma est chiant à écrire, il existe un nouveau format qui s’appelle RelaxNG et qui permet d’écrire plus facilement ses grammaires. L’avantage avec ce format est que tu peux préciser autant d’informations que tu te trouves dans le XML Schémas (par exemple le type, la cardinalité, etc). Ce qui est aussi bien est que tu peux faire de la transformation du RelaxNG -> XMLSchémas. Je t’invite à y jeter un coup d’oeil ici : http://relaxng.org/tutorial-2001120

  2. une tres belle facons de voir les choses oui meme si je suis ps convaincu que ca peut parcher 🙂

  3. Ping : Manipuler du JSON en PHP 30 minutes par jour

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*