PHP SimpleXML
SimpleXML est une extension PHP qui fournit une API simple pour travailler avec des documents XML, parser et manipuler leur contenu facilement.
Introduction
SimpleXML est une extension PHP intégrée qui transforme un document XML en objet navigable avec la syntaxe habituelle des propriétés et des tableaux. Au lieu de parcourir un arbre de nœuds manuellement, vous écrivez $xml->book->title — les noms d'éléments deviennent des propriétés et les éléments répétés deviennent des listes itérables.
Cela fait de SimpleXML la façon la plus rapide de lire un fichier de configuration, de consommer une réponse d'API XML ou de générer un petit document XML. Cette page couvre le chargement de XML, la lecture d'éléments et d'attributs, la gestion des espaces de noms, l'interrogation avec XPath, la modification de documents et la gestion des erreurs d'analyse.
SimpleXML est idéal pour les documents qui tiennent confortablement en mémoire et dont la structure est connue et relativement plate. Pour les très grands fichiers ou un contrôle fin et bas niveau, vous préférerez peut-être PHP XML DOM ou l'analyseur XML basé sur Expat.
Chargement d'un document XML
Vous construisez un SimpleXMLElement à partir de l'une de ces trois sources :
simplexml_load_string()— analyse le XML contenu dans une chaîne (pratique pour les réponses d'API).simplexml_load_file()— analyse le XML stocké dans un fichier ou une URL.new SimpleXMLElement($xml)— le constructeur, qui accepte une chaîne par défaut.
Les trois renvoient un SimpleXMLElement représentant l'élément racine du document — pas un wrapper autour du fichier entier. Ainsi, si votre racine est <library>, l'objet retourné est <library>.
<?php
$data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book category="fiction">
<title>The Hobbit</title>
<author>J.R.R. Tolkien</author>
<price>14.99</price>
</book>
<book category="science">
<title>A Brief History of Time</title>
<author>Stephen Hawking</author>
<price>18.50</price>
</book>
</library>
XML;
$library = simplexml_load_string($data);
echo get_class($library); // SimpleXMLElementLecture des éléments et des attributs
Les éléments enfants sont accessibles en tant que propriétés. Lorsqu'un élément se répète (comme <book>), la propriété se comporte comme une liste que vous pouvez indexer avec [] ou parcourir avec foreach. Les attributs se lisent avec un accès de style tableau ($element['attr']).
<?php
$library = simplexml_load_string($data); // the XML from above
echo $library->book[0]->title . "\n"; // The Hobbit
echo count($library->book) . "\n"; // 2
foreach ($library->book as $book) {
echo $book->title . " — " . $book['category'] . "\n";
}Sortie :
The Hobbit
2
The Hobbit — fiction
A Brief History of Time — scienceAttention : un élément accédé de cette façon est un
SimpleXMLElement, pas une chaîne.$book->prices'affiche comme texte grâce à sa méthode__toString(), mais pour des opérations arithmétiques ou des comparaisons strictes, effectuez d'abord un transtypage :(float) $book->priceou(string) $book['category']. Oublier le transtypage est le bug SimpleXML le plus courant.
Interrogation avec XPath
Pour tout ce qui dépasse la navigation simple — filtrage, recherche en profondeur dans l'arbre, sélection conditionnelle — utilisez xpath(). Il exécute une expression XPath et renvoie un tableau d'éléments correspondants.
<?php
$library = simplexml_load_string($data);
// Titles of books priced over 10
foreach ($library->xpath('//book[price>10]/title') as $title) {
echo $title . "\n";
}
// The Hobbit
// A Brief History of TimeUtilisation des espaces de noms
Lorsqu'un document utilise des espaces de noms XML, vous ne pouvez pas atteindre les éléments préfixés avec un simple accès par propriété — vous devez appeler children() (pour les éléments) ou attributes() (pour les attributs) avec l'URI de l'espace de noms, ou enregistrer le préfixe avant d'exécuter XPath.
<?php
$rss = <<<XML
<rss xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<item>
<title>Hello</title>
<dc:creator>Jane Doe</dc:creator>
</item>
</channel>
</rss>
XML;
$xml = simplexml_load_string($rss);
$item = $xml->channel->item;
// Access the dc: namespace by URI
$dc = $item->children('http://purl.org/dc/elements/1.1/');
echo $dc->creator . "\n"; // Jane DoeModification et création de XML
SimpleXML peut modifier des nœuds existants, en ajouter de nouveaux et sérialiser le résultat. Assignez à une propriété pour changer une valeur, appelez addChild() pour ajouter un élément et addAttribute() pour ajouter un attribut. asXML() retourne le document sous forme de chaîne, ou l'écrit dans un fichier si un chemin est fourni.
<?php
$book = simplexml_load_string('<book><title>Old Title</title><price>10.00</price></book>');
$book->title = 'New Title'; // change an existing value
$book->price = '12.50';
$book->addChild('author', 'Jane Doe'); // add a new element
$book->addAttribute('id', '42'); // add an attribute
echo $book->asXML();Sortie :
<?xml version="1.0"?>
<book id="42"><title>New Title</title><price>12.50</price><author>Jane Doe</author></book>Passer un nom de fichier — $book->asXML('book.xml') — écrit le document sur le disque et renvoie true en cas de succès. Voir asXML() pour la référence complète.
Gestion des erreurs d'analyse
Si le XML est mal formé, les fonctions de chargement retournent false et émettent des avertissements PHP. Pour capturer les erreurs silencieusement et les inspecter vous-même, activez la gestion interne des erreurs avec libxml_use_internal_errors() et lisez-les avec libxml_get_errors().
<?php
libxml_use_internal_errors(true);
$broken = "<library><book><title>Unclosed</book></library>";
$xml = simplexml_load_string($broken);
if ($xml === false) {
echo "Failed to parse XML:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . "\n";
}
libxml_clear_errors();
}Sortie :
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 avant d'utiliser le résultat — traiter un false comme un objet provoque des erreurs « tentative de lecture de propriété sur un booléen » en aval.
Résumé
- Chargez du XML avec
simplexml_load_string(),simplexml_load_file()ounew SimpleXMLElement(); l'objet retourné est l'élément racine. - Lisez les éléments enfants comme des propriétés et les attributs comme des clés de tableau ; transtypez en
(string),(int)ou(float)avant de comparer ou de calculer. - Utilisez
xpath()pour le filtrage et les requêtes profondes, etchildren()/attributes()avec un URI pour les documents avec espaces de noms. - Modifiez avec l'affectation de propriété,
addChild()etaddAttribute(), puis sérialisez avecasXML(). - Protégez-vous des entrées mal formées avec
libxml_use_internal_errors()etlibxml_get_errors().
Pour aller plus loin, consultez Obtenir des valeurs de nœuds avec SimpleXML, la présentation de l'analyseur SimpleXML et les fonctions libxml de bas niveau.