我正在flex 3
中处理项目,用户输入一些文本,该文本将存储在mysql
数据库中并在稍后显示。我使用XML
进行从flex到php的数据传输,反之亦然。 SimpleXMLElement
中的php
用于创建XML
。问题是特殊字符的XML
中断。
以下是示例代码:
FLEX:
var someXML:XML = <root><data>somedata</data><data>...</data> ... </root>
var data:Object = {};
data.xmlData = someXML;
saveDataService.send(data);
此处somedata
是用户输入的数据。在php
中,我使用someXML
提取SimpleXMLElement
并将其存储到mysql
。直到这里没有问题。即使somedata
具有特殊字符,其工作正常并且数据也能正确存储。
现在,在另一种情况下,从数据库获取数据并在flex中显示,来自php的响应中断了一个错误:
SimpleXMLElement :: addChild()[simplexmlelement.addchild]: 未终止的实体参考
我尝试在php中使用urlencode
,在flex中使用decodeURI
函数,但解码后的字符串不一样,解码后仍有少量特殊字符%xy
。
如何解决这个问题?
答案 0 :(得分:3)
在XML中,&
启动实体。 ;
结束了它。如果您有文字&
,您将获得未终结的实体参考。将所有不是实体的&
更改为&
,例如不要将>
更改为&gt;
。或者将一些数据放入CDATA部分。
答案 1 :(得分:2)
首先,如果你的xml中有一个悬空的&
字符,那么你会遇到xml语法错误。它与SimpleXML或任何其他解析器抱怨没有任何关系。我建议你在数据进入数据库之前解决这个问题,更好的是,在它发送到php服务之前。
戈登的建议至少适用于&
。您可能会遇到其他字符的问题,例如<
,"
等,稍后您将面临几乎相同的事情。
我建议您对xml中的 text 数据执行htmlentities
之类的操作,不,包括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的已清理的内容。它应该有效地将&
个字符转换为&
,所有这些字符。即,这也应该将>
的出现转变为&gt;
,所以要小心。
如果您还有其他需要,请告诉我。还有,你怎么做人!? ;)
编辑:哦,请记住,自从我使用php以来已经很久了,所以上面的一些信息可能有点过时了。请纠正我们。感谢。
答案 2 :(得分:1)
尝试使用htmlspecialchars转义数据,然后再将其传递给SimpleXMLElement :: addChild