Parseurs PHP XML : Guide complet
Apprenez à analyser XML en PHP avec SimpleXML, XMLReader et DOM. Exemples exécutables, gestion des erreurs avec libxml et choix du bon parseur.
XML (eXtensible Markup Language) est un format largement utilisé pour échanger des données structurées entre applications, services web et plateformes. Étant donné que de nombreuses API, fichiers de configuration et flux utilisent encore ce format, savoir lire du XML en PHP est une compétence pratique. Ce guide présente les trois parseurs XML intégrés livrés avec PHP — SimpleXML, XMLReader et DOM — montre des exemples exécutables pour chacun et vous aide à choisir le bon pour votre cas d'utilisation.
Qu'est-ce qu'un parseur PHP XML ?
Un parseur XML est une bibliothèque qui lit un document XML, vérifie qu'il est bien formé et donne à votre code un accès structuré à ses éléments, attributs et textes. PHP est livré avec trois parseurs natifs, tous construits sur le même moteur sous-jacent libxml :
- SimpleXML — un parseur arborescent qui charge l'intégralité du document dans un objet facile à utiliser.
- DOM — un parseur arborescent suivant le W3C Document Object Model, avec une API plus riche pour naviguer et modifier.
- XMLReader — un parseur en flux, basé sur un curseur, qui lit un nœud à la fois sans charger l'intégralité du document en mémoire.
« Arborescent » signifie que l'intégralité du document est conservée en mémoire sous forme de structure navigable — simple à utiliser mais gourmand en mémoire pour les gros fichiers. « En flux » (aussi appelé pull parsing) signifie que le parseur parcourt le document nœud par nœud, ce qui maintient une faible utilisation de la mémoire pour les fichiers volumineux.
Tous les exemples ci-dessous utilisent le même document exemple, intégré en ligne comme chaîne afin que vous puissiez les exécuter tels quels :
$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>PHP for Beginners</title>
<author>Jane Doe</author>
<year>2021</year>
</book>
<book>
<title>Advanced PHP</title>
<author>John Smith</author>
<year>2023</year>
</book>
</library>
XML;SimpleXML
SimpleXML offre le moyen le plus rapide de lire du XML. Vous chargez un document dans un objet SimpleXMLElement et accédez ensuite à ses données via des propriétés d'objet ordinaires — $xml->book[0]->title au lieu d'appels de méthodes. C'est idéal pour les documents petits à moyens dont vous connaissez déjà la structure.
Utilisez simplexml_load_string() pour du XML déjà disponible sous forme de chaîne, ou simplexml_load_file() pour lire directement depuis un fichier ou une URL.
$xml = simplexml_load_string($xmlString);
// Access a single value by position
echo $xml->book[0]->title . "\n";
// Loop over every <book> element
foreach ($xml->book as $book) {
echo "{$book->title} by {$book->author} ({$book->year})\n";
}Résultat :
PHP for Beginners
PHP for Beginners by Jane Doe (2021)
Advanced PHP by John Smith (2023)Notez que les valeurs d'éléments sont des objets SimpleXMLElement, pas des chaînes ordinaires. La concaténation ou echo les convertit automatiquement en texte, mais utilisez (string) lorsque vous avez besoin d'une vraie chaîne. Consultez PHP SimpleXML pour un examen plus approfondi, incluant la lecture des attributs et des espaces de noms.
XMLReader
XMLReader est un parseur en flux, à sens unique. Au lieu de construire un arbre, il avance dans le document un nœud à la fois, de sorte que la mémoire reste faible quelle que soit la taille du fichier. C'est donc le bon choix pour les grands flux ou exports où charger tout en une fois épuiserait la mémoire.
Appelez read() pour passer au nœud suivant, puis inspectez nodeType et name pour décider quoi faire. Utilisez open() pour lire depuis un fichier ou une URL, ou XML() pour lire depuis une chaîne.
$reader = new XMLReader();
$reader->XML($xmlString);
while ($reader->read()) {
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'title') {
echo $reader->readString() . "\n";
}
}
$reader->close();Résultat :
PHP for Beginners
Advanced PHPLa contrepartie est la commodité : étant donné que XMLReader ne contient qu'un seul nœud à la fois, il n'y a pas d'accès aléatoire — vous ne pouvez pas revenir en arrière ni interroger des éléments arbitraires comme vous le feriez avec un arbre. Un schéma courant consiste à diffuser jusqu'à l'élément souhaité, puis à transmettre ce sous-arbre à SimpleXML ou DOM avec expand().
DOM
L'extension DOM implémente le Document Object Model W3C standard. Comme SimpleXML, elle charge l'intégralité du document dans un arbre, mais expose une API plus complète pour naviguer dans les nœuds, interroger avec XPath et créer ou modifier des éléments. Choisissez DOM lorsque vous devez écrire ou restructurer du XML, pas seulement le lire.
Chargez du XML avec loadXML() (depuis une chaîne) ou load() (depuis un fichier), puis parcourez l'arbre avec des méthodes comme getElementsByTagName().
$dom = new DOMDocument();
$dom->loadXML($xmlString);
$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
echo $title->nodeValue . "\n";
}Résultat :
PHP for Beginners
Advanced PHPgetElementsByTagName() retourne une DOMNodeList que vous pouvez parcourir ou indexer avec ->item(0). Pour des requêtes plus complexes, vous pouvez associer DOMDocument à DOMXPath. Consultez PHP XML DOM pour l'API complète.
Gestion des erreurs d'analyse
Par défaut, un XML mal formé déclenche des avertissements PHP difficiles à exploiter par programmation. Appelez libxml_use_internal_errors(true) pour supprimer ces avertissements et collecter des objets d'erreur structurés avec libxml_get_errors() à la place. Les trois parseurs partagent ce mécanisme d'erreur libxml.
libxml_use_internal_errors(true);
$badXml = '<library><book><title>Unclosed</book></library>';
$xml = simplexml_load_string($badXml);
if ($xml === false) {
echo "Failed to parse XML:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . "\n";
}
libxml_clear_errors();
}Résultat :
Failed to parse XML:
Opening and ending tag mismatch: title line 1 and book
Opening and ending tag mismatch: book line 1 and library
Premature end of data in tag library line 1Vérifiez toujours la valeur de retour d'une fonction de chargement (false en cas d'échec) avant d'utiliser le résultat. Pour plus d'informations sur ces fonctions utilitaires, consultez PHP libxml.
Choisir le bon parseur PHP XML
| Parseur | Modèle | Mémoire | Idéal pour |
|---|---|---|---|
| SimpleXML | Arbre | Élevée | Lecture rapide de documents petits/moyens |
| DOM | Arbre | Élevée | Édition, requêtes XPath, construction de XML |
| XMLReader | Flux | Faible | Grands documents lus une fois, de haut en bas |
En résumé :
- Choisissez SimpleXML lorsque vous souhaitez simplement lire du XML connu et de taille modeste avec le moins de code possible.
- Choisissez DOM lorsque vous devez modifier des documents, exécuter des requêtes XPath ou générer du XML.
- Choisissez XMLReader lorsque le document est assez grand pour que le charger entièrement en mémoire pose problème.
Conclusion
PHP vous offre trois parseurs XML natifs, chacun adapté à un usage différent : SimpleXML pour des lectures rapides et simples, DOM pour la manipulation complète, et XMLReader pour le traitement en flux économe en mémoire des grands fichiers. Adaptez le parseur à la taille de votre document et à la nécessité de lire ou aussi d'écrire, encapsulez les chargements avec la gestion d'erreurs libxml, et vous pourrez analyser du XML de manière fiable dans n'importe quel projet PHP.
Pour aller plus loin, explorez PHP SimpleXML parser, PHP XML parser (Expat) et PHP XML DOM.