2011-08-02 90 views
2

我在flex 3,在用戶輸入一些文字將被存儲在一個數據庫mysql,後來顯示在項目的工作。我正在使用XML從flex到php的數據傳輸,反之亦然。 SimpleXMLElementphp正被用於創建XML。問題是特殊字符上的XML中斷。在PHP中創建XML使用SimpleXML有特殊字符

下面是示例代碼:

FLEX:

var someXML:XML = <root><data>somedata</data><data>...</data> ... </root> 
var data:Object = {}; 
data.xmlData = someXML; 

saveDataService.send(data); 

這裏somedata是由用戶輸入的數據。在php,我使用SimpleXMLElement提取someXML並將其存儲到mysql。這裏沒有問題。即使somedata有特殊字符,它的工作正常並且數據被正確存儲。

現在,在其他情況下,從數據庫中獲取數據,並在柔性顯示,從PHP斷響應一個錯誤:

SimpleXMLElement::addChild() [simplexmlelement.addchild]: unterminated entity reference

我試着彎曲使用PHP urlencodedecodeURI功能,但解碼後的字符串不一樣,解碼後仍然有少數特殊字符%xy

我該如何解決這個問題?

+1

通過做一些跟蹤和錯誤,我發現當有'&'字符時,XML會中斷。 – Anji

回答

2

首先,如果你在你的XML中晃來晃去&字符,那麼你有一個XML語法錯誤。它與SimpleXML或任何其他解析器抱怨無關。我建議你在數據進入數據庫之前解決這個問題,更好的是,在它被髮送到php服務之前。

戈登的建議的作品,爲&至少。你可能會與其他人物所面臨的問題一樣<"等,以後,你將面臨幾乎同樣的事情。

我建議你做一個htmlentities喜歡上了文字側數據的XML,包括XML標籤本身的操作。從http://thingsthatwork.net/index.php/2008/06/26/html-entities-and-actionscript/

XML(new XMLNode(XMLNodeType.TEXT_NODE, "content with special chars like & and others")).toXMLString(); 

採取下面的代碼沒有測試以上,但它應該回到你的消毒的內容,你可以把成XML。它應該有效地將&字符變成&amp;,全部都是。即,這也應該將&gt;的出現次數改爲&amp;gt;,所以要謹慎。

讓我知道你是否需要別的東西。另外,你怎麼做男人!? ;)

編輯:哦,記住,它一直以來我用PHP的很長一段時間,所以一些信息上面可能有點過。請糾正我的問題。謝謝。

+0

感謝您的迴應。會給和嘗試。是的,我做得很好。 – Anji

1

嘗試將它傳遞給的SimpleXMLElement ::的addChild

+0

這會將所需的xml語法字符轉換爲html實體,這會導致SimpleXML無法解析內容 –

+2

不,請嘗試調用此函數: $ document-> addChild('myElement',htmlspecialchars($ value) ); 否則只是使用DOMDocument,它會自動執行;-) – Ben

+0

啊,對。生鏽的我! :) –

3

在XML的&開始的實體之前,逃避與用htmlspecialchars您的數據。 ;結束它。當你有一個文字&你會得到一個未終止的實體引用。將所有不是實體的&更改爲&amp;,例如不要將&gt;更改爲&amp;gt;。或者將一些數據放入CDATA部分。