2010-08-05 4 views
0

Fondamentalement, j'ai un script qui met à jour un document XML à divers endroits ... Cependant, j'ai besoin que le texte soit en CDATA ... Alors j'ai essayé ça :Comment puis-je obtenir PHP simplexml pour enregistrer <comme lui-même au lieu de <

   $PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', '<![CDATA[' . $value[0] . ']]>'); 

Malheureusement, quand j'économise le code XML dans le fichier, le < et> dans CDATA se présentent comme < et gt $ respectivement; codes est-il un moyen d'éviter cela?

Note: Notre analyseur ne sait pas lire les &lt; et &gt; codes, donc c'est un problème grave

après avoir fait un print_r de mon objet simple_xml, le < lui-même apparaît comme dans la source code!

Il doit être le domsave qui le convertit en code d'entité ... des idées comment désactiver cela?

 //Convert SimpleXML element to DOM and save 
     $dom = new DOMDocument('1.0'); 
     $dom->preserveWhiteSpace = false; 
     $dom->formatOutput = false; 
     $dom->loadXML($xml->asXML()); 
     $dom->save($filename); 
+4

SimpleXML est, comme son nom l'indique, de simples modifications. Si vous avez besoin d'un contrôle approprié sur les nœuds, vous devriez envisager d'utiliser DOM. DOM a une méthode pour créer des sections CDATA. – Gordon

+1

Votre analyseur comprend les sections CDATA mais pas '<'? C'est étrange. Vous voudrez peut-être mettre à jour votre analyseur ... –

+0

C'est un projet de travail ... Je n'ai aucun contrôle sur l'analyseur – ThinkingInBits

Répondre

3

Comme je l'ai dit dans les commentaires, SimpleXML est très limité dans le contrôle qu'il vous donne sur les noeuds DOM. Voici un exemple sur comment remplacer un nœud DOMText par un nœud DOMCDATASection.

$dom = new DOMDocument; 
$dom->loadXML('<root><a>foo</a></root>'); 
$a = $dom->documentElement->childNodes->item(0); 
$a->replaceChild(
    $dom->createCDATASection('bar'), 
    $a->childNodes->item(0) 
); 
echo $dom->saveXml($a); // <a><![CDATA[bar]]></a> 

Pour un exemple long sur la façon d'utiliser DOM see my answer here et some more here

1

Tu ne peux pas utiliser la fonction html_entity_decode avant de l'envoyer à votre analyseur? Il convertira &lt et &gt retour à < et >

1

L'analyseur ne peut pas faire face aux sections CDATA? Dans ce cas, il ne s'agit pas d'un analyseur XML, vous devez donc écrire un outil qui génère une sortie de type XML au lieu d'un outil XML. (Ou corrigez l'analyseur pour qu'il devienne un analyseur XML)

Questions connexes