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


Creating XML in PHP using SimpleXML with special characters

我正在flex 3的项目上工作,其中用户输入一些要存储在mysql数据库中并稍后显示的文本。我使用XML从flex到php的数据传输,反之亦然。php中的SimpleXMLElement用于创建XML。问题是XML在特殊字符上中断。

下面是示例代码:

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有特殊字符,它也能正常工作,数据也能正常存储。

现在,在另一种情况下,从数据库中获取数据并在flex中显示,php的响应出现错误:

SimpleXMLElement: addChild () [simplexmlelement.addchild]:未终止实体引用

我尝试在php中使用urlencode,在flex中使用decodeURI函数,但解码后的字符串不一样,少数特殊字符解码后仍然是%xy

如何解决这个问题?

在XML中,&开始一个实体。;结束了它。当您有一个文字&时,您将获得一个未终止的实体引用。将所有不是实体的&更改为&amp;,例如不将&gt;更改为&amp;gt;。或者把一些数据放到CDATA部分

首先,如果您的xml中有一个悬空的&字符,那么您就有xml语法错误。这与SimpleXML或任何其他解析器的抱怨无关。我建议你在数据进入数据库之前修复这个问题,更好的是,在它被发送到php服务之前。

Gordon的建议至少对&有效。您可能会遇到其他字符的问题,如<, "等,稍后,您将面临几乎相同的事情。

我建议您对xml中的文本数据进行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;,所以要小心。

如果你还需要什么,请告诉我。还有,你好吗,伙计!?;)

Edit:哦,请记住,我已经很长时间没有使用php了,所以上面的一些信息可能有点偏离。请纠正我,伙计们。谢谢。

在将数据传递给SimpleXMLElement::addChild

之前,尝试用htmlspecialchars转译数据