2010-12-03 1 views

Répondre

5

Il peut être possible de modifier la chaîne d'indentation dans libxml, mais à ma connaissance vous ne pouvez pas modifier l'indentation DOM utilise. C'est possible pour XMLWriter cependant.

Comme alternative, vous pouvez utiliser Tidy prettyPrint 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; 

mais notez que ce comportement bizarre dans le cas ci-dessus. Il supprime les espaces dans l'élément barre sauf si vous frappez un xml:space="preserve" sur l'étiquette de la barre. Quand vous faites cela, il va garder les espaces, mais aussi mettre les nouvelles lignes avant et après. Vous devez jouer avec pour voir si cela correspond à votre problème. Voir Tidy docs

+0

Y a-t-il un moyen de changer cela quelque part dans un fichier de configuration? Il ne doit pas être à l'exécution. – ThinkingInBits

+0

@Thinking À ma connaissance, il n'y a aucun moyen de configurer cela à partir de PHP. – Gordon

7

Ce n'est pas une solution très agréable car il dépend de la connaissance que le format est préfixé avec double espaces:

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

Il remplace chaque empreinte avec 4 espaces. Ou vous pouvez supprimer le *4 et utiliser "\n" comme caractère répétitif.

+1

Merci! C'est exactement ce dont j'avais besoin pour changer le retrait de 2 espaces en tabulations, j'ai changé le retour en ceci: 'return str_repeat (" \ t ", intval (strlen ($ a [1])/2)). '<'; – Kus

Questions connexes