2010-08-06 8 views
8

zu speichern Ich verwende SimpleXML, um einen untergeordneten Knoten in einem meiner XML-Dokumente hinzuzufügen ... wenn ich eine print_r auf meinem simpleXML-Objekt mache, wird die < immer noch als angezeigt < in der Ansichtsquelle. Doch nachdem ich dieses Objekt wieder in XML DOMDocument speichern, wird die <-&lt; umgewandelt und die >-&gt;Wie Sie DOMDocument davon abhalten, <as & lt

umgewandelt Alle Ideen, wie dieses Verhalten zu ändern? Ich habe versucht, dom->substituteEntities = false; hinzuzufügen, aber das tat nicht gut.

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

Hier ist, wo ich bin mit dem <:

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

Das Problem, das ich einfach XML bin mit durch bestimmten Knoten im XML-Dokument zu durchlaufen, und wenn ein Attribut eines Spiel gegebenen ID wird ein bestimmter Kindknoten mit CDATA hinzugefügt. Nach der gesamten Verarbeitung speichere ich den XML-Code mit DOMDocument in die Datei zurück. Dort wird < in & lt konvertiert.

Hier ist ein Link zu meiner gesamten Klassendatei was ich versuche zu erreichen. Sehen Sie sich speziell die Methode hint_insert() unten an.

http://pastie.org/1079562

+0

'<' ist einfach kein Rechtscharakter innerhalb eines XML-Elements (es sei denn, Sie in einem CDATA-Abschnitt sind). Was versuchst du zu erreichen? – MvanGeest

+0

Ich versuche, ein CDATA-Tag hinzuzufügen ... Überprüfen Sie den ursprünglichen Beitrag für den aktualisierten Code – ThinkingInBits

+0

Vielen Dank für die Abstimmung! CDATA-Tag ist notwendig (außer Sie fliehen) in xml, wenn Sie '<' and '>' innerhalb eines Knotens haben! Das selbe wie XHTML ... – xandercoded

Antwort

10

SimpleXML und php5 DOM module verwenden die gleiche interne Darstellung des Dokuments (erleichtert durch libxml). Sie können zwischen beiden APIs wechseln, ohne das Dokument über simplexml_import_dom() und dom_import_simplexml() erneut zu analysieren.
I.e.Wenn Sie die Iteration mit SimpleXML api wirklich durchführen wollen/müssen, nachdem Sie Ihr Element gefunden haben, können Sie innerhalb des gleichen Dokuments zum DOM api und create the CData section wechseln.

<?php 
$doc = new SimpleXMLElement('<a> 
    <b id="id1">a</b> 
    <b id="id2">b</b> 
    <b id="id3">c</b> 
</a>'); 


foreach($doc->xpath('b[@id="id2"]') as $b) { 
    $b = dom_import_simplexml($b); 
    $cdata = $b->ownerDocument->createCDataSection('0<>1'); 
    $b->appendChild($cdata); 
    unset($b); 
} 

echo $doc->asxml(); 

druckt

<?xml version="1.0"?> 
<a> 
    <b id="id1">a</b> 
    <b id="id2">b<![CDATA[0<>1]]></b> 
    <b id="id3">c</b> 
</a> 
+0

DANKE. Dies ist die Information, die ich brauchte. Ich wusste nicht, dass ich beide austauschbar verwenden könnte. – ThinkingInBits

+0

Wird die Einstellung $ b = dom_import_simplexml ($ b) die Iteration durcheinander bringen? – ThinkingInBits

+0

Es funktioniert, aber ich verstehe nicht 100% warum: P – ThinkingInBits

3

Das Problem ist, dass Sie wahrscheinlich sind fügte hinzu, dass als String, statt als ein Element.

Anstatt also:

$simple->addChild('foo', '<something/>'); 

, die als Text behandelt werden:

$child = $simple->addChild('foo'); 
$child->addChild('something'); 

Sie können keine wörtliche < im Körper des XML-Dokuments haben, es sei denn es ist die Eröffnung eine Markierung.

Edit: Nach dem, was Sie in den Kommentaren beschreiben, ich glaube, du bist nach:

DomDocument::createCDatatSection()

$child = $dom->createCDataSection('your <cdata> body '); 
$dom->appendChild($child); 

Edit2: Nach dem Bearbeiten lesen, gibt es nur eine Sache, die ich kann sagen:

You're doing it wrong... Sie können Elemente nicht als Zeichenfolge Wert für ein anderes Element hinzufügen. Entschuldigung, du kannst einfach nicht. Aus diesem Grund entgeht es den Dingen, weil DOM und SimpleXML dafür sorgen, dass Sie immer gültiges XML erstellen. Sie müssen das Element als ein Objekt erstellen ... Also, wenn Sie das CDATA Kind erstellen möchten, würden Sie etwas tun müssen:

$child = $PrintQuestion.....->addChild('TextFragment'); 
$domNode = dom_import_simplexml($child); 
$cdata = $domNode->ownerDocument->createCDataSection($value[0]); 
$domNode->appendChild($cdata); 

Das ist alles da sollte es sein ...

+0

Es ist das Öffnen und Schließen eines CDATA-Tags, die mir das Problem gibt ... Bitte beziehen Sie sich auf den ursprünglichen Beitrag. – ThinkingInBits

+0

@ThinkingInBits: Siehe bearbeiten – ircmaxell

+0

Dies war auch die richtige Antwort, habe es zu der Zeit nicht verstanden. Trotzdem abgestimmt, danke. – ThinkingInBits

Verwandte Themen