2010-12-03 15 views

Respuesta

5

Podría ser posible cambiar la cadena de sangrado en libxml, pero que yo sepa no se puede alterar la sangría que DOM usa. Sin embargo, es posible para XMLWriter.

Como alternativa, se puede usar ordenado a prettyprint el XML:

$dom = new DOMDocument; 
$dom->preserveWhiteSpace = TRUE; 
$dom->loadXml('<root><foo><bar> baz </bar></foo></root>'); 
$tidy = tidy_parse_string($dom->saveXml(), array(
    'indent' => TRUE, 
    'input-xml' => TRUE, 
    'output-xml' => TRUE, 
    'add-xml-space' => FALSE, 
    'indent-spaces' => 4 
)); 
$tidy->cleanRepair(); 
echo $tidy; 

pero tenga en cuenta que esto comporta peculiar en el caso anterior. Elimina los espacios en el elemento de la barra a menos que abones un xml:space="preserve" en la etiqueta de la barra. Cuando lo haga, mantendrá los espacios pero también colocará líneas nuevas antes y después. Tienes que jugar con él para ver si se ajusta a tu problema. Ver Tidy docs

+0

¿Hay alguna manera de cambiar esto en algún lugar en un archivo de configuración? No tiene que ser en tiempo de ejecución. – ThinkingInBits

+0

@Thinking Que yo sepa, no hay forma de configurar esto desde PHP. – Gordon

7

Esto no es una solución muy agradable, ya que depende de saber que el formato se prefija con espacios dobles:

preg_replace_callback('/^(+)</m', function($a) { 
    return str_repeat(' ',intval(strlen($a[1])/2) * 4).'<'; 
}, $doc->saveXML()); 

Sustituye cada muesca con 4 espacios. O puede eliminar el *4 y usar "\n" como el carácter repetitivo.

+1

¡Gracias! Esto es exactamente lo que necesitaba para cambiar la sangría de 2 espacios en pestañas, cambié el retorno a esto: 'return str_repeat (" \ t ", intval (strlen ($ a [1])/2)). '<';' – Kus

Cuestiones relacionadas