simplexml_load_file()
SimpleXML est une extension PHP qui fournit une API simple pour travailler avec des documents XML. Découvrez simplexml_load_file() et son utilisation.
Introduction
simplexml_load_file() lit un fichier XML depuis le disque (ou une URL) et convertit son contenu en objet SimpleXMLElement que vous pouvez naviguer avec la syntaxe habituelle des propriétés PHP et des tableaux. C'est le point d'entrée basé sur les fichiers de l'extension SimpleXML — la façon la plus simple de transformer un document XML en quelque chose que vous pouvez parcourir et lire.
Utilisez-la chaque fois que vous disposez d'un fichier XML — un fichier de configuration, un flux RSS/Atom, une réponse d'API sauvegardée sur disque, ou un sitemap — et que vous souhaitez extraire des valeurs sans écrire un analyseur manuellement. Si votre XML se trouve dans une chaîne plutôt que dans un fichier, utilisez plutôt sa fonction sœur simplexml_load_string().
Ce chapitre couvre la signature de la fonction, un exemple complet et fonctionnel (incluant le XML qu'il lit), la façon d'accéder aux attributs et aux espaces de noms, et la gestion propre des échecs de chargement.
Syntaxe
simplexml_load_file(
string $filename,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false| Paramètre | Description |
|---|---|
$filename | Chemin ou URL du fichier XML à charger. |
$class_name | Classe à instancier. Doit étendre SimpleXMLElement ; par défaut SimpleXMLElement lui-même. |
$options | Masque de bits de constantes d'options libxml telles que LIBXML_NOCDATA ou LIBXML_NOBLANKS. |
$namespace_or_prefix | Préfixe d'espace de noms ou URI pour restreindre l'arbre retourné. |
$is_prefix | true si l'argument précédent est un préfixe, false s'il s'agit d'un URI. |
Valeur de retour : un SimpleXMLElement en cas de succès, ou false si le fichier ne peut pas être lu ou contient du XML malformé.
Un exemple complet
Supposons qu'un fichier nommé books.xml se trouve à côté de votre script :
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="b1">
<title>The PHP Way</title>
<author>Jane Doe</author>
<price currency="USD">29.99</price>
</book>
<book id="b2">
<title>XML in Practice</title>
<author>John Smith</author>
<price currency="EUR">24.50</price>
</book>
</library>Chargez-le, confirmez qu'il a été analysé, et itérez sur les éléments <book> :
<?php
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML file.\n";
exit(1);
}
foreach ($xml->book as $book) {
echo $book->title . " by " . $book->author . "\n";
}Résultat :
The PHP Way by Jane Doe
XML in Practice by John SmithNotez la comparaison stricte === false. Les objets SimpleXML sont « truthy », donc une vérification souple if (!$xml) peut se comporter de façon inattendue dans certains cas limites — comparez toujours explicitement avec false.
Lire les attributs
SimpleXML expose les éléments enfants comme propriétés d'objet ($book->title) et les attributs XML via un accès de style tableau ($book['id']). Comme les valeurs sont des objets SimpleXMLElement plutôt que des chaînes simples, convertissez-les avec (string) avant de les utiliser dans des calculs ou des comparaisons :
<?php
$xml = simplexml_load_file('books.xml');
foreach ($xml->book as $book) {
$id = (string) $book['id'];
$currency = (string) $book->price['currency'];
echo "{$id}: {$book->title} — {$book->price} {$currency}\n";
}Résultat :
b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EURTravailler avec les espaces de noms
Lorsqu'un document déclare des espaces de noms XML, l'accès par propriété simple n'atteint que l'espace de noms par défaut. Utilisez ->children($namespaceUri) pour descendre dans une branche avec espace de noms et ->attributes($namespaceUri) pour lire les attributs d'espace de noms :
<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;Pour un aperçu plus approfondi des espaces de noms et de la traversée, consultez SimpleXML en PHP.
Gérer les échecs de chargement proprement
Par défaut, un XML malformé émet des avertissements PHP. Pour les supprimer et inspecter les erreurs vous-même, activez la gestion interne des erreurs avec libxml_use_internal_errors() avant le chargement :
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_file('missing.xml');
if ($xml === false) {
echo "Could not load the file:\n";
foreach (libxml_get_errors() as $error) {
echo " " . trim($error->message) . "\n";
}
libxml_clear_errors();
}Résultat :
Could not load the file:
failed to load external entity "missing.xml"Ce modèle garde votre sortie propre et vous donne un accès structuré à chaque erreur d'analyse via libxml_get_errors().
Pièges courants
falsevs. avertissement. Un fichier manquant ou une erreur de syntaxe retournefalseet lève un avertissement à moins que vous n'activiez la gestion interne des erreurs. Vérifiez toujours la valeur de retour.- Convertissez avant de comparer.
$book->price == 29.99fonctionne par coïncidence ;(float) $book->price === 29.99est ce que vous voulez réellement. - Lecture de fichiers distants.
$filenamepeut être une URL, mais cela nécessite queallow_url_fopensoit activé dansphp.ini. - Écriture en retour. SimpleXML est excellent pour la lecture. Pour sérialiser un élément en chaîne XML, appelez
asXML().
Conclusion
simplexml_load_file() est le moyen le plus rapide de charger un fichier XML dans un arbre d'objets navigable en PHP. Combinez-le avec des vérifications strictes === false, des conversions (string) lors de la lecture des valeurs, et la gestion des erreurs libxml, et vous disposez d'une base solide pour consommer des flux, des configurations et des API XML. Pour les entrées sous forme de chaîne, utilisez simplexml_load_string(), et pour les techniques de traversée complète, continuez avec SimpleXML en PHP.