web-dev-qa-db-fra.com

PHP XML comment sortir le format de Nice

Voici les codes:

$doc = new DomDocument('1.0');
// create root node
$root = $doc->createElement('root');
$root = $doc->appendChild($root);
$signed_values = array('a' => 'eee', 'b' => 'sd', 'c' => 'df');
// process one row at a time
foreach ($signed_values as $key => $val) {
    // add node for each row
    $occ = $doc->createElement('error');
    $occ = $root->appendChild($occ);
    // add a child node for each field
    foreach ($signed_values as $fieldname => $fieldvalue) {
        $child = $doc->createElement($fieldname);
        $child = $occ->appendChild($child);
        $value = $doc->createTextNode($fieldvalue);
        $value = $child->appendChild($value);
    }
}
// get completed xml document
$xml_string = $doc->saveXML() ;
echo $xml_string;

Si je l’imprime dans le navigateur, je n’obtiens pas la structure Nice XML comme

<xml> \n tab <child> etc.

Je viens d'avoir

<xml><child>ee</child></xml>

Et je veux être utf-8 Comment est-ce possible de faire cela?

61
Dakadaka

Vous pouvez essayer de faire ceci:

...
// get completed xml document
$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éé le DOMDocument:

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

C'est probablement plus concis. La sortie dans les deux cas est ( Demo ):

<?xml version="1.0"?>
<root>
  <error>
    <a>eee</a>
    <b>sd</b>
    <c>df</c>
  </error>
  <error>
    <a>eee</a>
    <b>sd</b>
    <c>df</c>
  </error>
  <error>
    <a>eee</a>
    <b>sd</b>
    <c>df</c>
  </error>
</root>

Je ne sais pas comment changer le ou les caractères d'indentation avec DOMDocument. Vous pouvez post-traiter le fichier XML avec un remplacement basé sur une expression régulière ligne par ligne (par exemple, avec preg_replace ):

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

Alternativement, il y a l'extension tidy extension with tidy_repair_string qui peut très bien imprimer des données XML. Il est possible de spécifier des niveaux d'indentation avec ce dernier, mais soigné ne produira jamais d'onglets.

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

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

Donc, vous pouvez simplement enregistrer XML simple dans un nouveau fichier spécifié par $newfile

30
heavenevil
<?php

$xml = $argv[1];

$dom = new DOMDocument();

// Initial block (must before load xml string)
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
// End initial block

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

print_R($out);
17
sigkill

Deux problèmes différents ici:

  • Définissez les attributs formatOutput et preserveWhiteSpace sur TRUE pour générer du code XML formaté:

    $doc->formatOutput = TRUE;
    $doc->preserveWhiteSpace = TRUE;
    
  • De nombreux navigateurs Web (notamment Internet Explorer et Firefox) mettent en forme XML lorsqu'ils le affichent. Utilisez la fonctionnalité Afficher la source ou un éditeur de texte standard pour inspecter la sortie.


Voir aussi xmlEncoding et encoding .

4
Álvaro González
// ##### IN SUMMARY #####

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

/*
 * echo xml in source format
 */
function echoFormattedXML($xmlFilepath) {
    header('Content-Type: text/xml'); // to show source, not execute the xml
    echo formatXML($xmlFilepath); // format the xml to make it readable
} // echoFormattedXML

/*
 * format xml so it can be easily read but will use more disk space
 */
function formatXML($xmlFilepath) {
    $loadxml = simplexml_load_file($xmlFilepath);

    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($loadxml->asXML());
    $formatxml = new SimpleXMLElement($dom->saveXML());
    //$formatxml->saveXML("testF.xml"); // save as file

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

J'ai essayé toutes les réponses mais aucune n'a fonctionné. C'est peut-être parce que j'ajoute et supprime des enfants avant de sauvegarder le XML. Après beaucoup de recherches sur Google ce commentaire dans la documentation php. Je n'ai eu qu'à recharger le XML résultant pour le faire fonctionner.

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

Ceci est une légère variation du thème ci-dessus, mais je mets ici au cas où d'autres le feraient et ne pourraient pas le comprendre ... comme je l'ai fait.

Si vous utilisez saveXML (), preserveWhiteSpace dans le document DOM cible ne s'applique pas aux nœuds importés (à la date PHP 5.6).

Considérons le code suivant:

$dom = new DOMDocument();                               //create a document
$dom->preserveWhiteSpace = false;                       //disable whitespace preservation
$dom->formatOutput = true;                              //pretty print output
$documentElement = $dom->createElement("Entry");        //create a node
$dom->appendChild ($documentElement);                   //append it 
$message = new DOMDocument();                           //create another document
$message->loadXML($messageXMLtext);                     //populate the new document from XML text
$node=$dom->importNode($message->documentElement,true); //import the new document content to a new node in the original document
$documentElement->appendChild($node);                   //append the new node to the document Element
$dom->saveXML($dom->documentElement);                   //print the original document

Dans ce contexte, l'instruction $dom->saveXML(); n'imprimera PAS assez le contenu importé de $ message, mais le contenu d'origine dans $ dom sera assez imprimé.

Afin d’obtenir une jolie impression pour l’ensemble du document $ dom, la ligne:

$message->preserveWhiteSpace = false; 

doit être inclus après la ligne $message = new DOMDocument(); - c'est-à-dire. le/les document (s) à partir duquel les noeuds sont importés doit également avoir preserveWhiteSpace = false.

1
Pancho