2009-04-28 3 views
81

Sto provando ad aggiungere alcuni dati a un file XML esistente utilizzando il SimpleXML di PHP. Il problema è che aggiunge tutti i dati in una sola riga:PHP simpleXML come salvare il file in modo formattato?

<name>blah</name><class>blah</class><area>blah</area> ... 

E così via. Tutto in una sola riga. Come introdurre interruzioni di riga?

Come faccio a fare così?

<name>blah</name> 
<class>blah</class> 
<area>blah</area> 

sto usando asXML() funzione.

Grazie.

+0

C'è anche il pacchetto PEAR [XML_Beautifier] (http://pear.php.net/package/XML_Beautifier). – karim79

risposta

133

È possibile utilizzare il DOMDocument class riformattare il codice:

$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($simpleXml->asXML()); 
echo $dom->saveXML(); 
+0

Grazie. Funziona alla grande. – Alagu

+0

Grazie. Semplice ed efficiente. –

+2

Quindi non è possibile con SimpleXML? –

17

Usa dom_import_simplexml convertire in DomElement. Quindi utilizzare la sua capacità di formattare l'output.

$dom = dom_import_simplexml($simple_xml)->ownerDocument; 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
echo $dom->saveXML(); 
+0

non funziona. La funzione restituisce un DOMElement, non un DOMDocument – karka91

+0

Sembra 'documentElement' dovrebbe essere' ownerDocument'. Non sono sicuro se l'API è cambiato o questo è solo un errore di battitura. L'ho corretto ora. – troelskn

+2

si prega di notare che questo non funziona ancora come preserveWhiteSpace e formatOutput deve essere impostato _before_ importare il documento per avere qualche effetto :) – karka91

27

soluzione di Gumbo fa il trucco. Puoi lavorare con simpleXml qui sopra e aggiungerlo alla fine a echo e/o salvarlo con la formattazione.

codice qui sotto echos e salva in un file (vedere commenti nel codice e rimuovere tutto ciò che non si vuole):

//Format XML to save indented tree rather than one line 
$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($simpleXml->asXML()); 
//Echo XML - remove this and following line if echo not desired 
echo $dom->saveXML(); 
//Save XML to file - remove this and following line if save not desired 
$dom->save('fileName.xml'); 
+0

funziona ancora come un fascino !! – Risinek

2

Come Gumbo e Witman risposto; caricamento e salvataggio di un documento XML da un file esistente (ci sono molti neofiti da queste parti) con DOMDocument::load e DOMDocument::save.

<?php 
$xmlFile = 'filename.xml'; 
if(!file_exists($xmlFile)) die('Missing file: ' . $xmlFile); 
else 
{ 
    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dl = @$dom->load($xmlFile); // remove error control operator (@) to print any error message generated while loading. 
    if (!$dl) die('Error while parsing the document: ' . $xmlFile); 
    echo $dom->save($xmlFile); 
} 
?>