使用带有特殊字符的SimpleXML在PHP中创建XML

时间:2011-08-02 16:10:21

标签: php mysql xml flex special-characters

我正在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

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

在XML中,&启动实体。 ;结束了它。如果您有文字&,您将获得未终结的实体参考。将所有不是实体的&更改为&amp;,例如不要将&gt;更改为&amp;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的已清理的内容。它应该有效地将&个字符转换为&amp;,所有这些字符。即,这也应该将&gt;的出现转变为&amp;gt;,所以要小心。

如果您还有其他需要,请告诉我。还有,你怎么做人!? ;)

编辑:哦,请记住,自从我使用php以来已经很久了,所以上面的一些信息可能有点过时了。请纠正我们。感谢。

答案 2 :(得分:1)

尝试使用htmlspecialchars转义数据,然后再将其传递给SimpleXMLElement :: addChild