Ressources » PHP

Mémo - XML/DOM et PHP

Ce tutoriel a pour but de vous faire découvrir d'une manière simple et intuitive les principales possibilités offertes par PHP dans sa version 5 pour manipuler des données XML.

Les bases du XML

L'exemple ci-dessous servira de support à l'ensemble de ce tutoriel. Il s'agit d'un carnet d'adresse sauvegardé dans un fichier XML très simple.

Ce tutoriel n'est pas un cours sur le XML, mais un petit rappel ne fait pas de mal...

XML (eXtensible Markup langage) que l'on peut traduire par "Langage à balises étendu" permet de séparer le contenu de la présentation... ce qui permet par exemple, d'afficher un même document sur des applications ou des périphériques différents sans nécessiter de créer autant de versions du document qu'il y a de représentations !

XSLT (eXtensible StyleSheet langage Transformation). Ce langage permet de transformer la structure des éléments XML.

DTD (Document Type Definition), permet de vérifier la conformité d'un document XML.

Un document suivant les règles du XML est appelé document bien formé. Un document XML possédant une DTD et étant conforme à celle-ci est appelé document valide.

L'exemple ci-dessus est donc un document bien formé. Pour être un document valide, on pourrait lui attacher une DTD comme celle-ci:

Manipuler les documents XML

Lire et écrire un fichier XML avec DOM.

Lire

$tree = new domDocument();
$tree->load('carnet.xml');
$noms = $tree->getElementsByTagName('nom');
echo "Nom : ".$noms->item(0)->nodeValue;

Écrire

$tree = new domDocument();
$tree->load('carnet.xml');
$noms = $tree->getElementsByTagName('nom');
$nom = $noms->item(0);
$nom->nodeValue = 'Dupont';
//Pour afficher le résultat dans le fichier
echo $tree->saveXML();
//Pour le sauvegarder dans le fichier "carnet.xml"
$tree->save("carnet.xml")

Ces deux méthodes permettent de manipuler assez simplement un document XML.
Cependant, pour de plus grosses manipulations, ou de lourds fichiers, mieux vaut priviligier d'autres méthodes, tel que l'utilisation de XPath (cf. chapitre suivant).

Document Object Model

DOM (Document Object Model), est une spécification du W3C (World Wide Web Consortium) définissant la structure d'un document sous forme d'une hiérarchie d'objets, afin de simplifier l'accès aux éléments constitutifs du document.

Plus exactement DOM est un langage normalisé d'interface (API, Application Programming Interface), indépendant de toute plateforme et de tout langage, permettant à une application de parcourir la structure du document et d'agir dynamiquement sur celui-ci. Ainsi Javascript et ECMAScript utilisent DOM pour naviguer au sein du document HTML, ce qui leur permet par exemple de pouvoir récupérer le contenu d'un formulaire, le modifier, etc.

$tree = new domDocument();
$tree->load('carnet.xml');
echo <<
L'élément racine est : {$tree->documentElement->nodeName}.
Ce dernier possède {$tree->documentElement->childNodes->length} élément(s) fils.
rvd;

XPath

XPath permet de faire des recherches avancées au sein d'un document XML.

Il fixe des contraintes très précises portant principalement sur le chemin entre la racine du document et l'élément recherché.
Par exemple, une requète permet de lister les éléments descendants de adresse, nommés numero et possédant un attribut type.

$tree = new domDocument();
$tree->load('carnet.xml');
$monxpath = new domXPath($tree);
$liste = $monxpath->query('adresse/nom');
for($i=0; $i < $liste->length; $i++){
echo $liste->item(0)->nodeValue;
}

L'exemple ci-dessus permet de voir les possibilités de XPath, mais ce n'est qu'un aperçu. Pour plus d'information, mieux vaut consulter la recommandation du W3C pour voir toute l'étendu des capacités de ce langage.

La classe domXPath permet de définir le contexte XPath, l'environnement de gestion des requètes.

SimpleXML

SimpleXML est une alternative très séduisante, notamment pour les débutants, car elle permet de manipuler les fichiers XML très simplement.

$racine = simplexml_load_file('carnet.xml');
$racine->adresse->nom = 'Tomet';
$racine->adresse->prenom = 'Jerry';
$racine->adresse->adresse = '18 rue de Nantes';
//Pour afficher le résultat dans le fichier
print $racine->asXML();

Difficile de faire plus simple !

SimpleXML, permet même de faire des requètes XPath, notamment pour des manipulations plus complexes.

$racine = simplexml_load_file('carnet.xml');
$elements = $racine->xpath('adresse/nom');
while(list( , $node) = each($elements)) {
echo 'Nom : '.$node."n";
}

Pourquoi utiliser DOM si SimpleXML est si simple ?
Pour 2 raisons :

  1. Premièrement, il est impossible avec SimpleXML de réaliser des transformations XSL.
  2. Enfin, SimpleXML demande bien plus de ressources systèmes que DOM.
Cependant, SimpleXML reste une alternative très interessante pour des fichiers de tailles raisonnables.

En résumé...

Pourquoi utiliser le XML comme base de données ?

Il est vrai que manipuler un fichier avec PHP et DOM révèle une certaine complexité, cependant dans certains cas, il apporte bien plus d'avantage qu'une base de données MySQL.
En effet, grâce à ce langage, développer une application multi supports et multi plate-formes est extrèmement plus aisé.

Ainsi, si vous souhaitez partager des informations, le fil RSS sera l'idéal!
Si vous changez de serveur, pas de problème de récupération et de conversion de la base de données.
Idem si vous souhaitez développer une application multi plate-formes (mobile, navigateur, etc.)

Quelques bonnes adresses :

SimpleXML, permet même de faire des requêtes XPath, notamment pour des manipulations plus complexes.