asXML()
Apprenez comment PHP SimpleXMLElement::asXML() retourne du XML sous forme de chaîne ou l'écrit dans un fichier, avec exemples et pièges courants.
Introduction
SimpleXMLElement::asXML() est la méthode à appeler lorsque vous avez terminé de construire ou de modifier du XML avec SimpleXML et que vous souhaitez récupérer le résultat - soit sous forme de string que vous pouvez afficher, retourner ou stocker, soit écrit directement dans un fichier. C'est essentiellement l'inverse de simplexml_load_string() : là où le chargement transforme du texte XML en un object navigable, asXML() retransforme cet object en texte XML.
Cette page couvre les deux modes de fonctionnement, ce que la méthode retourne, son comportement sur un nœud unique par rapport au document entier, et les pièges à éviter (pas d'indentation automatique, pas de déclaration XML sur les sous-nœuds).
Syntaxe
// Mode 1: retourner le XML sous forme de string
public SimpleXMLElement::asXML(): string|false
// Mode 2: écrire le XML dans un fichier, retourner true/false
public SimpleXMLElement::asXML(string $filename): bool$filename(facultatif) - si fourni, le XML est écrit à ce chemin et la méthode retournetrueen cas de succès oufalseen cas d'échec. Si omis, le XML est retourné sous forme de string.
asXML()etsaveXML()sont des alias - ils font exactement la même chose.
Retourner le XML sous forme de string
Appelez asXML() sans argument pour obtenir le document sous forme de string. C'est l'utilisation la plus courante - sérialiser, puis afficher, journaliser, ou envoyer en tant que corps de réponse HTTP.
Résultat :
<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>Nous construisons l'arbre avec addChild(), puis asXML() sérialise l'ensemble. Notez que la sortie est sur une seule ligne - SimpleXML n'indente pas et ne formate pas la sortie. Voir Pièges ci-dessous pour savoir comment le formater.
Appeler asXML() sur un nœud unique
asXML() fonctionne sur n'importe quel élément, pas seulement sur la racine du document. Appelée sur un nœud enfant, elle sérialise uniquement ce nœud et ses descendants - et, fait important, elle omet la déclaration <?xml ... ?>, car un fragment n'est pas un document autonome.
<?php
$xml = new SimpleXMLElement(
'<books><book><title>PHP Basics</title></book></books>'
);
// Document entier - inclut la déclaration XML
echo $xml->asXML(), "\n";
// Un nœud unique - pas de déclaration, juste le fragment
echo $xml->book->title->asXML(), "\n";Résultat :
<?xml version="1.0"?>
<books><book><title>PHP Basics</title></book></books>
<title>PHP Basics</title>Cela rend asXML() pratique pour extraire une branche d'un document plus grand en tant qu'extrait autonome.
Écrire le XML dans un fichier
Passez un nom de fichier et asXML() écrira le document à cet emplacement plutôt que de retourner une string. La valeur de retour est un boolean à vérifier, car l'écriture peut échouer (mauvais chemin, permissions insuffisantes, disque plein).
<?php
$xml = new SimpleXMLElement('<config><host>localhost</host></config>');
if ($xml->asXML('config.xml')) {
echo "Saved successfully\n";
} else {
echo "Failed to write file\n";
}Lorsqu'un nom de fichier est fourni, asXML() retourne true (et non la string XML), donc n'essayez pas d'afficher son résultat en espérant obtenir le balisage.
Pièges
-
Pas d'indentation automatique.
asXML()produit du XML compact sur une seule ligne. Pour l'indenter, passez la string au DOM :<?php $xml = new SimpleXMLElement('<a><b>hi</b></a>'); $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml->asXML()); echo $dom->saveXML();Résultat :
<?xml version="1.0"?> <a> <b>hi</b> </a> -
La sortie d'un sous-nœud n'a pas de déclaration XML - seule la racine du document produit la ligne
<?xml ... ?>. -
falsesignifie un échec. Lors de l'écriture dans un fichier, testez toujours la valeur de retour boolean plutôt que de supposer le succès.
Voir aussi
addChild()- construire l'arbre à sérialiser avecasXML().saveXML()- l'alias deasXML().children()etattributes()- naviguer dans l'object avant la sérialisation.- Introduction à SimpleXML - vue d'ensemble de l'extension SimpleXML.
Conclusion
SimpleXMLElement::asXML() sérialise un object SimpleXML en texte XML. Sans argument, elle retourne le balisage sous forme de string ; avec un nom de fichier, elle écrit le document sur le disque et retourne un boolean. N'oubliez pas qu'elle produit une sortie compacte (utilisez DOM si vous avez besoin d'indentation) et qu'appeler cette méthode sur un nœud enfant produit un fragment sans déclaration.