2010-07-01 6 views
3

Mon nom Rithy.PHP DOM append enfant avec nouvelle ligne

Je ne sais pas comment ajouter une nouvelle ligne avant d'ajouter un nouveau noeud ou élément dans le fichier XML.

Mon php:

$dom = new DOMDocument(); 

$dom->formatOutput = true; 

$dom->preserveWhiteSpace = true; 

$dom->load($xml_file); 

$body = $dom->getElementsByTagName('body')->item(0); 

$newelement_seg = $dom->createElement('seg'); 

$data = $dom->createTextNode(" text 2 "); 

$newelement_seg->appendChild($data); 

$body->appendChild($newelement_seg); 

$dom->save($xml_file); 

XML Avant ajouter un nouvel enfant:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <seg> 
     text 1 
    </seg> 
</body> 
</xml> 

XML après un nouvel enfant append:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <seg> 
     text 1 
    </seg> 
    <seg> 
     text 2 
    </seg> 
</body> 
</xml> 

Mais je veux:

<?xml version="1.0" encoding="UTF-8"?> 
    <body> 
     <seg> 
      text 1 
     </seg> 
     <seg> 
      text 2 
     </seg> 
    </body> 
</xml> 
<hr/> 

Merci à l'avance!

+4

Votre question serait beaucoup plus lisible si elle était correctement formatée. Et franchement, cliquer sur le bouton "code" aurait été beaucoup plus facile de votre côté que de remplacer tous les angles par des entités HTML et de tout espacer. –

Répondre

2

Qu'essayez-vous d'accomplir? En définissant preserveWhiteSpace à true (inutile, c'est la valeur par défaut), vous indiquez à libxml de ne pas ignorer les nœuds de texte composés uniquement d'espaces blancs. Pourtant, en même temps, vous essayez de mettre en forme le fichier XML, qui, pour être vraiment joli, nécessite des nœuds d'espaces. Ensuite, même en ignorant l'espace blanc, vous devez réaliser que l'espace blanc à l'intérieur des balises <seg> est significatif; libxml ne les supprimera pas; si vous forcez un saut de ligne après text 1, dans la ligne suivante, la balise de fermeture </seg> ne doit pas être indentée, sinon le contenu du nœud de texte à l'intérieur de la balise serait différent.

Votre code me donne ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
<seg> 
    text 1 
</seg> 
<seg> text 2 </seg></body> 

Puisque vous dites libxml que les espaces est importante, il ne peut pas mettre un saut de ligne après la deuxième </seg>, sinon ce serait créer un autre nœud de texte.

Si vous dites $dom->preserveWhiteSpace = false;:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <seg> 
    text 1 
</seg> 
    <seg> text 2 </seg> 
</body> 

Les balises sont en retrait, mais libxml ne pouvez toujours pas faire:

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <seg> 
    text 1 
    </seg> 
    <seg> 
    text 2 
    </seg> 
</body> 

parce qu'il serait en train de changer le contenu des noeuds de texte à l'intérieur <seg>.

Vous voudrez peut-être essayer tidy, même si je ne suis pas sûr qu'il fera ce que vous voulez.

+0

OK, c'est réglé par problème! Merci beaucoup! Pour le texte de la balise seg, je pourrais le faire. – Rithy

6

À Résumer les réponses données:

  1. vous devez définir formatOutput true

  2. vous devez définir ignoreWhiteSpace false

-à-dire:

$dom = new DomDocument(); 
$dom->formatOutput = true; 
$dom->preserveWhiteSpace = false; 
$dom->load($myxmlfile); 
+0

Oui, vous avez raison! – Rithy

3

Solution parfaite. Ça marche. Voici le code que j'ai utilisé:

 //create new document object 
     $dom_object = new DOMDocument(); 

     //load xml file 
     $xml_file_path = get_template_directory()."/flash/playlist.xml"; 
     $dom_object->formatOutput = true;  
     $dom_object->preserveWhiteSpace = false; 
     $dom_object->load($xml_file_path);