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?

4voto

Álvaro G. Vicario Points 57607

Deux problèmes différents ici :

  • Définir les attributs formatOutput et preserveWhiteSpace sur TRUE pour générer un XML formaté :

    $doc->formatOutput = TRUE;
    $doc->preserveWhiteSpace = TRUE;
  • De nombreux navigateurs web (notamment Internet Explorer et Firefox) formatent le XML lorsqu'ils l'affichent. Utilisez la fonction Afficher le code source ou un éditeur de texte normal pour inspecter la sortie.


Voir aussi xmlEncoding et encoding.

2voto

Pancho Points 52

Ceci est une légère variation du thème ci-dessus mais je le mets ici au cas où d'autres rencontrent ce problème et ne peuvent pas le comprendre ...comme j'ai pu le faire.

Lors de l'utilisation de saveXML(), preserveWhiteSpace dans le DOMdocument cible ne s'applique pas aux noeuds importés (comme c'était le cas en PHP 5.6).

Considérez le code suivant :

$dom = new DOMDocument();                               //créer un document
$dom->preserveWhiteSpace = false;                       //désactiver la préservation des espaces blancs
$dom->formatOutput = true;                              //afficher une sortie mise en page
$documentElement = $dom->createElement("Entrée");        //créer un nœud
$dom->appendChild ($documentElement);                   //l'ajouter 
$message = new DOMDocument();                           //créer un autre document
$message->loadXML($messageXMLtext);                     //charger le nouveau document à partir du texte XML
$node=$dom->importNode($message->documentElement,true); //importer le contenu du nouveau document dans un nouveau nœud du document original
$documentElement->appendChild($node);                   //ajouter le nouveau nœud à l'élément du document
$dom->saveXML($dom->documentElement);                   //afficher le document original

Dans ce contexte, l'instruction $dom->saveXML(); NE mettra PAS en page le contenu importé de $message, mais le contenu original de $dom sera mis en page correctement.

Pour obtenir une mise en page correcte pour l'ensemble du document $dom, la ligne :

$message->preserveWhiteSpace = false; 

doit être incluse après la ligne $message = new DOMDocument(); - c'est-à-dire que les documents à partir desquels les nœuds sont importés doivent également avoir preserveWhiteSpace = false.

0voto

Ruben Estrada Points 187

Basé sur la réponse de @heavenevil Cette fonction pretty prints en utilisant le navigateur

function prettyPrintXmlToBrowser(SimpleXMLElement $xml)
{
    $domXml = new DOMDocument('1.0');
    $domXml->preserveWhiteSpace = false;
    $domXml->formatOutput = true;
    $domXml->loadXML($xml->asXML());
    $xmlString = $domXml->saveXML();
    echo nl2br(str_replace(' ', ' ', htmlspecialchars($xmlString)));
}

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