73 votes

PHP XML comment produire un format d'affichage agréable

Voici les codes:

$doc = new DomDocument('1.0');
// créer un nœud racine
$root = $doc->createElement('root');
$root = $doc->appendChild($root);
$signed_values = array('a' => 'eee', 'b' => 'sd', 'c' => 'df');
// traiter une ligne à la fois
foreach ($signed_values as $key => $val) {
    // ajouter un noeud pour chaque ligne
    $occ = $doc->createElement('error');
    $occ = $root->appendChild($occ);
    // ajouter un noeud enfant pour chaque champ
    foreach ($signed_values as $fieldname => $fieldvalue) {
        $child = $doc->createElement($fieldname);
        $child = $occ->appendChild($child);
        $value = $doc->createTextNode($fieldvalue);
        $value = $child->appendChild($value);
    }
}
// obtenir le document xml complet
$xml_string = $doc->saveXML() ;
echo $xml_string;

Si je l'imprime dans le navigateur, je n'obtiens pas une structure XML agréable comme

 \n tab  etc.

Je reçois simplement

ee

Et je veux être en utf-8 Comment est-il possible de faire tout cela?

128voto

hakre Points 102271

Vous pouvez essayer de faire ceci :

...
// obtenir le document XML complété
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$xml_string = $doc->saveXML();
echo $xml_string;

Vous pouvez également définir ces paramètres juste après avoir créé l'DOMDocument :

$doc = new DomDocument('1.0');
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;

C’est probablement plus concis. La sortie dans les deux cas est (Démonstration) :

    eee
    sd
    df

    eee
    sd
    df

    eee
    sd
    df

Je ne sais pas comment changer le(s) caractère(s) d'indentation avec DOMDocument. Vous pourriez post-traiter le XML avec un remplacement basé sur des expressions régulières ligne par ligne (par exemple avec preg_replace) :

$xml_string = preg_replace('/(?:^|\G)  /um', "\t", $xml_string);

Alternativement, il existe l'extension tidy avec tidy_repair_string qui peut aussi formater joliment les données XML. Il est possible de spécifier les niveaux d'indentation avec cette méthode, cependant tidy n'affichera jamais de tabulations.

tidy_repair_string($xml_string, ['input-xml'=> 1, 'indent' => 1, 'wrap' => 0]);

35voto

heavenevil Points 351

Avec un objet SimpleXml, vous pouvez simplement

$domxml = new DOMDocument('1.0');
$domxml->preserveWhiteSpace = false;
$domxml->formatOutput = true;
/* @var $xml SimpleXMLElement */
$domxml->loadXML($xml->asXML());
$domxml->save($newfile);

$xml est votre objet simplexml

Ensuite, votre objet simpleXml peut être sauvegardé dans un nouveau fichier spécifié par $newfile

20voto

sigkill Points 211
preserveWhiteSpace = false;
$dom->formatOutput = true;
// Fin du bloc initial

$dom->loadXML($xml);
$out = $dom->saveXML();

print_R($out);

6voto

René Points 41
// ##### EN RÉSUMÉ #####

$xmlChemin = 'test.xml';
echoFormattedXML($xmlChemin);

/*
 * afficher le xml dans son format source
 */
function echoFormattedXML($xmlChemin) {
    header('Content-Type: text/xml'); // pour afficher la source et non exécuter le xml
    echo formatXML($xmlChemin); // formater le xml pour le rendre lisible
} // echoFormattedXML

/*
 * formater le xml pour qu'il soit facilement lisible mais utilisera plus d'espace disque
 */
function formatXML($xmlChemin) {
    $loadxml = simplexml_load_file($xmlChemin);

    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($loadxml->asXML());
    $formatxml = new SimpleXMLElement($dom->saveXML());
    //$formatxml->saveXML("testF.xml"); // sauvegarder en tant que fichier

    return $formatxml->saveXML();
} // formatXML

5voto

Take Points 51

J'ai essayé toutes les réponses mais aucune n'a fonctionné. Peut-être parce que j'ajoute et supprime des enfants avant d'enregistrer le XML. Après beaucoup de recherches, j'ai trouvé ce commentaire dans la documentation de php. J'ai simplement dû recharger le XML résultant pour que ça fonctionne.

$outXML = $xml->saveXML(); 
$xml = new DOMDocument(); 
$xml->preserveWhiteSpace = false; 
$xml->formatOutput = true; 
$xml->loadXML($outXML); 
$outXML = $xml->saveXML();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X