W3docs

PHP SimpleXML - simplexml_load_file et simplexml_load_string

Apprenez à lire et manipuler des données XML en PHP avec l'extension SimpleXML, simplexml_load_file() et simplexml_load_string().

Comment obtenir et lire du XML avec PHP SimpleXML

L'extension SimpleXML de PHP est le moyen le plus rapide de lire et modifier des documents XML. Au lieu de parcourir manuellement un arbre de nœuds, SimpleXML transforme l'ensemble du document en un objet PHP ordinaire dont vous accédez aux éléments avec la syntaxe familière des propriétés et des tableaux — $xml->title, $xml->item[0], $xml['id'].

Ce chapitre couvre les deux fonctions permettant de charger du XML — simplexml_load_file() (pour un fichier ou une URL) et simplexml_load_string() (pour du XML déjà disponible sous forme de chaîne) — ainsi que la lecture des éléments, la lecture des attributs, l'itération sur des nœuds répétés, l'ajout de nouvelles données et la sérialisation du résultat en XML.

SimpleXML est livré avec la distribution standard de PHP et est activé par défaut, il n'y a donc généralement rien à installer.

Quand utiliser SimpleXML (et quand ne pas l'utiliser)

  • Utilisez SimpleXML pour lire et modifier légèrement du XML bien formé : fichiers de configuration, flux RSS/Atom, réponses API simples, sitemaps.
  • Préférez DOMDocument lorsque vous avez besoin d'un contrôle précis : insertion de nœuds à un emplacement spécifique, manipulation des commentaires ou validation de schéma.
  • Utilisez le parseur XML (Expat) pour les très grands documents que vous souhaitez traiter événement par événement sans tout charger en mémoire.

Chargement des données XML

La première étape consiste à charger le XML dans un objet SimpleXML. Il existe deux points d'entrée, et le choix dépend uniquement de l'emplacement actuel de votre XML.

Chargement d'un fichier XML avec simplexml_load_file()

simplexml_load_file() lit du XML depuis un chemin local ou une URL et retourne un SimpleXMLElement. En cas d'erreur d'analyse, il retourne false et émet un avertissement.

<?php

// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');

if ($xml === false) {
    echo "Failed to load XML.";
} else {
    echo $xml->book[0]->title; // first <title>
}

Chargement d'une chaîne XML avec simplexml_load_string()

Lorsque le XML est déjà dans une variable — par exemple le corps d'une réponse HTTP — utilisez simplexml_load_string() à la place.

php— editable, runs on the server

Les deux fonctions retournent l'élément racine du document, et non un wrapper autour de lui. Dans l'exemple ci-dessus, $xml est <root>, et $xml->child est le nœud <child> qu'il contient.

Astuce : un SimpleXMLElement possède une valeur similaire à une chaîne mais reste un objet. Enveloppez-le dans (string) (ou concaténez-le) chaque fois que vous avez besoin d'une chaîne PHP simple — par exemple $title = (string) $xml->book[0]->title;. Consultez convertir SimpleXML en chaîne pour plus de détails.

Accès aux données XML

Une fois chargé, vous lisez le document avec la syntaxe objet et tableau.

Accès aux éléments

Les éléments enfants sont des propriétés d'objet. Lorsqu'une balise se répète, indexez-la comme un tableau ; [0] correspond à la première occurrence.

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XML

Itération sur des éléments répétés

Comme les balises répétées se comportent comme une liste itérable, foreach est la façon naturelle de les lire toutes :

<?php

$data = <<<XML
<library>
  <book><title>PHP Basics</title></book>
  <book><title>Advanced XML</title></book>
</library>
XML;

$xml = simplexml_load_string($data);

foreach ($xml->book as $book) {
    echo $book->title, "\n";
}
// PHP Basics
// Advanced XML

Accès aux attributs

Les attributs sont accessibles avec la syntaxe tableau sur l'élément qui les porte :

<?php

$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');

echo $xml['id'], "\n";    // 42
echo $xml['lang'], "\n";  // en

Modification des données XML

SimpleXML peut également construire et modifier des documents en place.

Ajout d'éléments

addChild() ajoute un nouvel élément et retourne l'élément créé, ce qui permet de continuer à chaîner les appels :

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->child; // Value

Ajout d'attributs

addAttribute() ajoute un attribut à l'élément sur lequel vous l'appelez :

<?php

$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');

echo $xml->child['attribute']; // on

Conversion de SimpleXML en XML

asXML() sérialise l'objet en une chaîne XML (sans argument) ou l'écrit directement dans un fichier (lorsque vous passez un chemin). C'est ainsi que vous persistez les modifications apportées ci-dessus. Consultez la méthode asXML pour en savoir plus.

<?php

$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');

echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>

Gestion du XML malformé

En cas d'échec, ces fonctions retournent false et déclenchent un avertissement, ce qui est difficile à gérer. Transformez les avertissements en erreurs collectables avec libxml_use_internal_errors() :

<?php

libxml_use_internal_errors(true);

$xml = simplexml_load_string('<root><child></root>'); // missing </child>

if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message), "\n";
    }
    libxml_clear_errors();
}

Conclusion

SimpleXML est le chemin le plus rapide depuis un fichier ou une chaîne XML vers des données PHP lisibles. Chargez avec simplexml_load_file() ou simplexml_load_string(), lisez les éléments et attributs avec la syntaxe propriété et tableau, itérez sur les nœuds répétés avec foreach, modifiez avec addChild() et addAttribute(), et sérialisez à nouveau avec asXML(). Pour un traitement plus lourd, passez à DOMDocument ; pour le streaming de fichiers volumineux, utilisez le parseur XML.

Pratique

Pratique
Quelle méthode l'extension PHP SimpleXML utilise-t-elle pour analyser un fichier XML ?
Quelle méthode l'extension PHP SimpleXML utilise-t-elle pour analyser un fichier XML ?
Was this page helpful?