2009-04-28 18 views
81

Estoy tratando de agregar algunos datos a un archivo XML existente utilizando SimpleXML de PHP. El problema es que agrega todos los datos en una sola línea:PHP simpleXML ¿cómo guardar el archivo de forma formateada?

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

Y así sucesivamente. Todo en una sola línea. ¿Cómo introducir saltos de línea?

¿Cómo lo hago así?

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

Estoy usando la función asXML().

Gracias.

+0

También está el paquete de PEAR [XML_Beautifier] (http://pear.php.net/package/XML_Beautifier). – karim79

Respuesta

133

Se podría utilizar el DOMDocument class volver a formatear el código:

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

Gracias. Funciona genial. – Alagu

+0

Gracias. Simple y eficiente. –

+2

Entonces, ¿no es posible con SimpleXML? –

17

Uso dom_import_simplexml a convertir en un DomElement. Luego use su capacidad para formatear la salida.

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

no funciona. La función devuelve un elemento DOME, no un DOMDocument – karka91

+0

Parece 'documentElement' debe ser' ownerDocument'. No estoy seguro si la API cambió o esto es solo un error tipográfico. Lo he corregido ahora. – troelskn

+2

tenga en cuenta que esto todavía no funciona, ya que preserveWhiteSpace y formatOutput deben establecerse _antes de_ importar el documento para que tenga algún efecto :) – karka91

27

solución de Gumbo hace el truco. Puedes trabajar con simpleXml arriba y luego agregar esto al final para eco y/o guardarlo con el formateo.

código de abajo ecos y lo guarda en un archivo (ver comentarios en el código y eliminar todo lo que no quiere):

//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

todavía funciona como un encanto! – Risinek

2

Como Gumbo y Witman contestado; cargando y guardando un documento XML de un archivo existente (somos muchos novatos por aquí) con DOMDocument::load y 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); 
} 
?> 
Cuestiones relacionadas