W3docs

SimpleXML en PHP : Guide complet

SimpleXML est un outil puissant en PHP pour analyser et manipuler des données XML. Ce tutoriel vous montre comment utiliser SimpleXML en PHP.

SimpleXML est une extension PHP intégrée qui transforme un document XML en un arbre d'objets que vous pouvez lire, parcourir et modifier avec la syntaxe PHP ordinaire. Ce tutoriel couvre le chargement de XML, la lecture des éléments et des attributs, la gestion des espaces de noms, la modification des nœuds et l'écriture du résultat — avec des exemples exécutables et les pièges les plus courants.

Introduction à SimpleXML

SimpleXML est une extension PHP qui vous permet d'analyser et de manipuler des données XML avec très peu de code. Elle est distincte de l'extension DOM, mais toutes deux reposent sur la même bibliothèque libxml2, dont elles partagent la gestion des erreurs. Le compromis est simple :

  • SimpleXML — idéal pour lire du XML bien formé dont vous parcourez principalement une structure connue. Accès concis, semblable aux objets.
  • DOM — mieux adapté aux modifications intensives, au déplacement de nœuds, ou lorsque vous avez besoin d'un contrôle total sur l'arbre du document.

SimpleXML est activé par défaut dans les installations PHP standard, il n'y a donc généralement rien à installer.

Chargement du XML

Il existe deux points d'entrée. Utilisez simplexml_load_file() pour un fichier ou une URL, et simplexml_load_string() pour du XML que vous avez déjà dans une chaîne (par exemple, une réponse d'API).

Comme les deux fonctions s'appuient sur libxml2, un document mal formé déclenche des avertissements PHP et retourne false. Basculez toujours vers la gestion interne des erreurs avec libxml_use_internal_errors() afin de pouvoir inspecter les erreurs vous-même plutôt que de laisser fuir des avertissements vers la sortie :

Chargement d'un fichier XML

libxml_use_internal_errors(true);

$xml = simplexml_load_file('data.xml');
if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message), PHP_EOL;
    }
    die('Failed to load XML.');
}

simplexml_load_string() fonctionne de façon identique mais prend le texte XML directement :

Chargement du XML depuis une chaîne

$source = '<data><item><name>John Doe</name></item></data>';
$xml = simplexml_load_string($source);

Dans les deux cas, la valeur de retour est un SimpleXMLElement représentant l'élément racine du document.

Accès aux éléments

SimpleXML mappe chaque élément enfant sur une propriété de l'objet parent, accessible avec l'opérateur PHP -> (pas la notation pointée — PHP n'a pas d'accès membre avec .). Les éléments enfants répétés sont adressés par index. Considérez ce XML :

Exemple XML

<data>
  <item>
    <name>John Doe</name>
    <age>30</age>
  </item>
  <item>
    <name>Jane Doe</name>
    <age>28</age>
  </item>
</data>

Lisez le premier élément, puis parcourez chaque item avec foreach :

Accès aux valeurs des éléments

// The first <item> (index 0)
$name = $xml->item[0]->name;
$age  = $xml->item[0]->age;

// Iterate through all <item> elements
foreach ($xml->item as $item) {
    echo $item->name . ' is ' . $item->age . ' years old.' . PHP_EOL;
}

Le piège de la conversion en chaîne

$item->name n'est pas une chaîne — c'est un SimpleXMLElement. Il ressemble à une chaîne lorsqu'il est affiché parce que l'élément est automatiquement converti dans les contextes de chaîne. Si vous le stockez dans un tableau, le passez à json_encode(), ou le comparez strictement, convertissez-le explicitement d'abord :

$name = (string) $xml->item[0]->name;   // plain string
$age  = (int)    $xml->item[0]->age;     // plain int

Lecture des attributs

Les attributs des éléments sont accessibles avec la syntaxe de tableau, pas l'opérateur ->. Pour <item id="1" status="active">, lisez-les comme ceci :

Accès aux attributs

$id     = (string) $xml->item[0]['id'];      // "1"
$status = (string) $xml->item[0]['status'];  // "active"

// Loop over every attribute on an element
foreach ($xml->item[0]->attributes() as $key => $value) {
    echo "$key = $value" . PHP_EOL;
}

Travail avec les espaces de noms

Le XML qui utilise des espaces de noms (préfixes comme <atom:link>) ne se résoudra pas via un accès direct aux propriétés — vous devez enregistrer l'espace de noms avec children() ou utiliser une requête XPath. C'est la raison la plus courante pour laquelle « l'élément est vide » alors qu'il est clairement dans le fichier :

Éléments avec espaces de noms

$source = '<feed xmlns:atom="http://www.w3.org/2005/Atom">'
        . '<atom:title>Hello</atom:title></feed>';
$xml = simplexml_load_string($source);

$atom  = $xml->children('http://www.w3.org/2005/Atom');
echo (string) $atom->title;   // "Hello"

Requêtes avec XPath

Pour tout ce qui va plus loin qu'un enfant direct, xpath() retourne un tableau d'éléments correspondants — bien plus propre que d'imbriquer des boucles :

// Every <name> anywhere under the root
foreach ($xml->xpath('//name') as $name) {
    echo (string) $name . PHP_EOL;
}

Modification et ajout d'éléments

Vous pouvez modifier une valeur en l'assignant à la propriété, et enrichir l'arbre avec addChild() / addAttribute() :

Modification et construction de nœuds

// Change existing values
$xml->item[0]->name = 'John Smith';
$xml->item[0]->age  = 32;

// Add a brand-new child element and an attribute
$new = $xml->addChild('item');
$new->addChild('name', 'New Person');
$new->addAttribute('id', '99');

Assigner une valeur remplace le contenu textuel de l'élément ; addChild() ajoute un nouvel élément plutôt que d'en écraser un.

Conversion en XML

Utilisez la méthode asXML() pour sérialiser l'arbre (éventuellement modifié) en chaîne, puis écrivez-le avec file_put_contents() :

Enregistrement des modifications en XML

file_put_contents('data.xml', $xml->asXML());

Appelé sans argument, asXML() retourne le document complet sous forme de chaîne incluant la déclaration <?xml version="1.0"?> — exactement ce qu'il vous faut pour sauvegarder. Appelez-le sur un élément enfant ($xml->item[0]->asXML()) pour n'obtenir que ce fragment, sans la déclaration.

Conclusion

SimpleXML est le moyen le plus rapide de lire et d'éditer légèrement du XML bien formé en PHP : chargez avec simplexml_load_file() ou simplexml_load_string(), parcourez l'arbre avec -> et l'indexation de tableau, lisez les attributs avec [], et sérialisez avec asXML(). Retenez les deux pièges récurrents — convertissez les éléments en chaînes avant de les réutiliser, et enregistrez les espaces de noms avant d'accéder aux nœuds préfixés. Pour l'édition programmatique et à grande échelle de documents, utilisez l'extension DOM à la place. Pour aller plus loin, continuez avec PHP SimpleXML et lecture de données avec SimpleXML get.

Pratique

Pratique
Que fait l'extension SimpleXML en PHP ?
Que fait l'extension SimpleXML en PHP ?
Was this page helpful?