2010-08-05 39 views
0

基本上我有一個腳本,更新各個地方的XML文檔...但是,我需要的文本在CDATA ...所以我試圖這:我怎樣才能得到PHP simplexml保存<本身,而不是<

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

不幸的是,當我保存XML迴文件時,<和> CDATA拿出他們各自的<和$ GT;代碼有沒有辦法避免這種情況?

注:我們的解析器不知道如何閱讀&lt;&gt;代碼,所以這是當仁不讓simple_xml對象的print_r的後一個嚴重的問題

,該<表現爲自己在源碼!

它必須是將它轉換成實體代碼的domsave ......任何想法如何禁用它?

 //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就像名稱所暗示的那樣,用於簡單的修改。如果你需要對節點進行適當的控制,你應該考慮使用DOM。 DOM有一個創建CDATA節的方法。 – Gordon 2010-08-05 20:19:41

+1

你的解析器理解CDATA部分,但不是'<'?這很奇怪。你可能想更新你的解析器... – 2010-08-05 20:36:11

+0

這是一個工作項目...我無法控制解析器 – ThinkingInBits 2010-08-05 20:40:18

回答

3

就像我說的意見,SimpleXML的是非常的它可以讓你的DOM節點控制的限制。以下是如何用DOMCDATASection節點替換DOMText節點的示例。

$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> 

有關如何使用DOM see my answer heresome more here

1

分析器不能CDATA部分應付冗長的例子嗎?在這種情況下,它不是一個XML解析器,因此您需要編寫一個工具來生成類似XML的輸出,而不是XML工具。 (或修復解析器,使其成爲XML解析器)