2012-08-10 146 views
2

我有一个用PHP文件解析的XML文件。我必须包含许多需要CDATA才能正确解析的“特殊”字符。<![CDATA[]>在XML标记

有没有办法告诉我的PHP文件读取所有的标签,就好像有一个块在乞讨和标签?

截至目前为每个XML标签创建我必须把CDATA块:

<tag><![CDATA[blah.......]]></tag> 

有没有一种方法来设置它,我没有为艾薇每次写CDATA标签在我的XML?

+1

如果您控制XML的创建,那么您肯定可以逃避实体以避免使用CDATA。如果您使用的是像SimpleXML这样的东西,那么您可以随时扩展它,并将它视为包含在CDATA中的所有数据,而不是真的如此,但这看起来更麻烦而不值得。 – 2012-08-10 19:56:43

回答

2

CDATA是一个坏主意!它有很多问题。您应该做什么,而不是每个值使用htmlspecialchars()

好的..保持你的降薪!以下是CDATA的一些问题。

首先,简单的一点:你不能逃避]]>序列。这可能看起来不是什么大问题,但如果你选择了'转义字符序列'的任何方法,那么你应该选择一个可以让每一个序列易于理解的方法。

现在对于大的一个:CDATA经常被用作hack来将Latin1数据注入到UTF-8文档中。人们认为,我在XML中有一个转义问题,所以我将使用CDATA作为解决方法。

在CDATA 中允许任何字符序列,并且该块中的XML文档的指定字符编码不再相关。然而,任何类型的文本实际上都有一个字符编码,而不是通过收敛编码(你应该做什么),而是通过将其包装在CDATA中来“破解”它。

对于编码二进制数据也不是一种可行的方法,因为仍然不允许控制字符。

所以,CDATA的意思是'这里是龙',这里有字节不是在指定的编码,我可以告诉你没有控制字符。

对于消费者来说,这是一个坏主意,因为所有有关字符编码的假设现在都消失了。

这里有一些链接:

+1

如果没有*你解释CDATA不好的原因,这不是一个真正有用的答案。 (不是我的-1,顺便说一句,只是猜测*为什么*你有-1)。 – Matt 2012-08-10 19:49:50

+0

“CDATA是一个坏主意!它存在许多问题。”你能稍微扩展一下吗?在问答网站上告诉人们“围绕Google”留下很多不足之处。 – vcsjones 2012-08-10 19:50:11

+0

这很容易google :) – Evert 2012-08-10 19:50:18

2

你还没有告诉我们具体你指的是什么“特殊字符”,但我假设你的意思是某种重音字符,或非拉丁字母中的字符,等?

在大多数情况下,可以通过使用UTF-8字符集输出文档来解决问题。

在其余的情况下,它可以通过使用XML实体来解决 - 例如&#160;

这两个都比使用CDATA更好的解决方案。