2011-10-11 30 views
1

我有XML,我需要用戶能夠編輯(一textarea內)對他的胃口,然後重新進行添加到一個DOMDocument這裏是我到目前爲止所。上一層>一個createTextNode不編碼XML

$dom = new DOMDocument(); 
$dom->formatOutput = true;  //Formating the output 
$ele = $dom->createElement("someele", "Hello"); 
$dom->appendChild($ele); 

$string = "<yowhatsup><noway>some text</noway></yowhatsup>"; 

$ele = $dom->createElement("otherxmlstuff", $string); 
$dom->appendChild($ele); 

現在的輸出編碼$string變量,這是不是對我好,我希望用戶能夠添加XML以及串到我的DOMDocument。

我可以做一些預處理,把文字變成元素爲好,還是我找錯了樹。

+0

是XML應該是文檔的一部分,或者被認爲是一些要素的數據?您是否希望將它與文檔中的其他XML一起解析,例如應該'getElementsByTagName('yowhatsup')'找到它?還是應該是一個孤立的數據?如果第一個,請參閱下面的答案。如果是後者,搜索SO如何添加DOM的CDATA部分。 – Gordon

+0

@Gordon文檔的一部分 –

回答

2

您可以使用DOMDocumentFragment及其appendXML()方法,例如

<?php 
$doc = new DOMDocument(); 
$doc->formatOutput = true; 
$ele = $doc->createElement("someele", "Hello"); 
    $xmlstuff = $doc->createElement("otherxmlstuff"); 

     $fragment = $doc->createDocumentFragment(); 
     $fragment->appendXML("<foo>text</foo><bar>text2</bar>"); 
     $xmlstuff->appendChild($fragment); 

    $ele->appendChild($xmlstuff); 
$doc->appendChild($ele); 
echo $doc->saveXML(); 

打印

<?xml version="1.0"?> 
<someele>Hello<otherxmlstuff><foo>text</foo><bar>text2</bar></otherxmlstuff></someele> 
+0

:D只是修復它,來看看你發佈了同樣的東西:D,接受快速gonzalas –

4

你需要創建一個DOMDocumentFragment而非元素。當您設置一個元素的文本 - 當你與createElement方法做的 - 它是HTML編碼。這是正確的行爲。如果你想包括任意XML,使用createDocumentFragmentappendXML

<?php 

$dom = new DOMDocument(); 
$dom->formatOutput = true;  //Formating the output 
$ele = $dom->createElement("someele", "Hello"); 
$dom->appendChild($ele); 

$string = "<yowhatsup><noway>some text</noway></yowhatsup>"; 

$frag = $dom->createDocumentFragment(); 
$frag->appendXML($string); 
$dom->appendChild($frag); 

但要非常仔細消毒,從你的用戶輸入。如果你不清理好,你最終會在XSS漏洞,允許插入任意內容。