Parser un fichier XML avec l’API DOM
Ce petit article n’a pas pour objectif de vous enseigner XML, ni ne prétend être un cours exhaustif au sujet de l’API DOM. Il vous expliquera seulement, comment, à partir d’un fichier XML, extraire les données qu’il contient, et les afficher dans une page web. Nous utiliserons pour cela le langage PHP5.
Pour parser un fichier XML, il existe de nombreuses méthodes. Vous pouvez utiliser les fonctions standards de traitements de fichiers, et chaines de caractères, alliées aux très puissantes expressions régulières, ou si vous souhaitez perdre moins de temps utiliser SimpleXML beaucoup plus adapté. Il existe un troisième chemin, pas toujours plus efficace, ni même plus simple, mais qui offre l’avantage d’être un standard du W3C accessible depuis la plupart des langages. Vous l’avez bien compris, nous allons utiliser le Document Object Model, déjà survolé quelquefois en Javascript sans toujours oser le nommer.
Nous allons donc supposer que vous ayez un fichier XML à parser. Nous ne nous poserons pas de questions sur la validé de ce fichier avec la DTD qui lui est associé. Vous ne savez pas ce qu’est une DTD ? Tant mieux, cela ne vous servirait à rien ici. Tout ce que nous voulons c’est extraire des données du fichier. Imaginons que notre fichier contienne les données qui suivent :
<catalogue>
<ordinateurs>
<marque prix="1200">Sony</marque>
<marque prix="1800">Fujitsu</marque>
<marque prix="1300">IBM</marque>
</ordinateurs>
<imprimantes>
<marque prix="300">Epson</marque>
</imprimantes>
</catalogue>
Récupérer le contenu d’une balise
Par récupérer le contenu d’une balise, nous entendons le texte se trouvant entre la balise ouvrante, et celle fermante, ainsi, Sony, Fujitsu, IBM, et Epson sont des contenus de balise. Supposons que nous voulions afficher la liste des marques d’ordinateurs, voici le code que nous devrions utiliser :
<?php
$dom =new DomDocument();
$dom->load('monfichier.xml');
$ordinateurs=$dom->getElementsByTagName('ordinateurs')->Item(0);
$marques = $ordinateurs-> getElementsByTagName('marque');
foreach($marques as $marque)
$listemarques[] = $marque->firstChild->nodeValue
?>
Le fonctionnement de ce code est assez simple. On crée un nouvel objet DOM, on charge le fichier XML contenant les données à parser. getElementsByTagName nous permet d’identifier les éléments possédant le TagName “ordinateur”, Item(0) pointe vers le premier d’entre eux. A partir de la, il ne nous reste plus qu’à identifier les éléments possédant le TagName “marque” parmi ceux ayant le TagName “ordinateur”. Un foreach dans la structure résultante nous permet alors de tous les afficher.
Récupérer le contenu d’un attribut
Nous entendons par attribut le texte se trouvant entre les guillemets de notre exemple XML. Nous allons donc ici récupérer les prix. Pour cela, le code utilisé sera tout aussi simple, à celui précédement vu, on rajoute tout simplement ceci :
if ($marque->hasAttribute('prix'))
{
$listeprix[] = $marque->getAttribute('prix');
}
hasAttribute, nous permet de vérifier l’existence de l’attribut prix pour la marque correspondante, et getAttribute en récupére la valeur. Bien sûr, $listemarques et $listeprix sont des tableaux. Il existe un grand nombre d’autres fonctions dans l’api DOM, aussi je vous renvois vers le manuel php, mais vous en savez déjà suffisament pour extraire les données que vous souhaiteriez d’un fichier XML.














svp on sachant le nom de l’element qui est ds ce cas ‘marque’ et le nodeValue ’sony’ par exemple !!!
comment peut on lister le nom de tou les attribut ainsi que leurs valeur suposant qu’on a à par l’attribut prix un autre attribut nb comme suit :
Sony
Fujitsu
IBM
Personnellement, je ne crois plus trop en Sony : Trop de probl