asXML()
Scopri come SimpleXMLElement::asXML() restituisce XML come stringa o lo scrive su file, con esempi e insidie comuni.
Introduzione
SimpleXMLElement::asXML() è il metodo da chiamare quando si ha finito di costruire o modificare XML con SimpleXML e si vuole ottenere il risultato di ritorno — sia come stringa da visualizzare con echo, restituire o memorizzare, sia scritta direttamente su un file. È essenzialmente l'inverso di simplexml_load_string(): mentre il caricamento converte il testo XML in un object navigabile, asXML() converte tale object di nuovo in testo XML.
Questa pagina tratta le due modalità di funzionamento, cosa restituisce, come si comporta su un singolo nodo rispetto all'intero documento, e le insidie che creano problemi (nessuna formattazione leggibile, nessuna dichiarazione XML sui sotto-nodi).
Sintassi
// Modalità 1: restituisce l'XML come stringa
public SimpleXMLElement::asXML(): string|false
// Modalità 2: scrive l'XML su un file, restituisce true/false
public SimpleXMLElement::asXML(string $filename): bool$filename(opzionale) - se fornito, l'XML viene scritto in questo percorso e il metodo restituiscetruein caso di successo ofalsein caso di errore. Se omesso, l'XML viene restituito come string.
asXML()esaveXML()sono alias — fanno esattamente la stessa cosa.
Restituire XML come stringa
Chiama asXML() senza argomenti per ottenere il documento come string. Questo è l'utilizzo più comune — serializzare, poi visualizzare con echo, registrare nei log o inviare come corpo di una risposta HTTP.
Output:
<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>Costruiamo l'albero con addChild(), poi asXML() serializza tutto. Si noti che l'output è su una singola riga — SimpleXML non applica rientri o formattazione leggibile. Vedi Insidie di seguito per sapere come formattarlo.
Chiamare asXML() su un singolo nodo
asXML() funziona su qualsiasi elemento, non solo sulla radice del documento. Chiamato su un nodo figlio, serializza solo quel nodo e i suoi discendenti — e, cosa importante, omette la dichiarazione <?xml ... ?>, perché un frammento non è un documento autonomo.
<?php
$xml = new SimpleXMLElement(
'<books><book><title>PHP Basics</title></book></books>'
);
// Intero documento - include la dichiarazione XML
echo $xml->asXML(), "\n";
// Un singolo nodo - nessuna dichiarazione, solo il frammento
echo $xml->book->title->asXML(), "\n";Output:
<?xml version="1.0"?>
<books><book><title>PHP Basics</title></book></books>
<title>PHP Basics</title>Questo rende asXML() utile per estrarre un ramo di un documento più grande come frammento autonomo.
Scrivere XML su un file
Passa un nome file e asXML() scriverà il documento lì invece di restituire una string. Il valore restituito è un boolean che dovresti verificare, poiché la scrittura può fallire (percorso errato, nessun permesso, disco pieno).
<?php
$xml = new SimpleXMLElement('<config><host>localhost</host></config>');
if ($xml->asXML('config.xml')) {
echo "Salvato con successo\n";
} else {
echo "Impossibile scrivere il file\n";
}Quando viene fornito un nome file, asXML() restituisce true (non la string XML), quindi non cercare di visualizzare con echo il suo risultato aspettandoti il markup.
Insidie
-
Nessuna formattazione leggibile.
asXML()produce XML compatto su una singola riga. Per indentarlo, passa la string al 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();Output:
<?xml version="1.0"?> <a> <b>hi</b> </a> -
L'output di un sotto-nodo non ha la dichiarazione XML — solo la radice del documento produce la riga
<?xml ... ?>. -
falsesignifica errore. Quando si scrive su un file, testa sempre il valore boolean restituito invece di presumere il successo.
Correlati
addChild()- costruisci l'albero che serializzi conasXML().saveXML()- l'alias diasXML().children()eattributes()- naviga l'object prima di serializzarlo.- Introduzione a SimpleXML - il quadro generale dell'estensione SimpleXML.
Conclusione
SimpleXMLElement::asXML() serializza un object SimpleXML di nuovo in testo XML. Senza argomenti restituisce il markup come string; con un nome file scrive il documento su disco e restituisce un boolean. Ricorda che produce output compatto (usa DOM se hai bisogno di indentazione) e che chiamarlo su un nodo figlio produce un frammento privo di dichiarazione.