正如问题所述,我正在尝试使用PHP从MySQL的文本字段中读取数据来生成XML输出(对于iPhone应用程序)。
只要字段中存在水平省略号字符,就无法正确生成XML。
我已经尝试了一些方法来逃避它,如下所示,但似乎没有工作......
$row['detail'] = str_replace("&", "&", $row['detail']);
$row['detail'] = str_replace("…", "…", $row['detail']); //<-- prob is here
$row['detail'] = str_replace("<", "<", $row['detail']);
$row['detail'] = str_replace("\'", "'", $row['detail']);
$row['detail'] = str_replace(">", ">", $row['detail']);
$row['detail'] = str_replace("\"", """, $row['detail']);
我基本上有两个问题,
如何处理水平省略号字符?
是否还有更多此类字符会导致此类问题?对此列表及其解决方案的任何引用都会很棒!
谢谢
答案 0 :(得分:8)
可以(以及推荐的方式)在XML输出中使用文字的实际字符。不要使用基于HTML实体的解决方法 - 这是不必要的。
它不适合您的原因可能是因为省略号字符的编码与正在生成的XML文件的编码不匹配。
你只需要确保它们匹配。例如,如果您要生成UTF-8 XML文件,则省略号字符也必须是UTF-8。
答案 1 :(得分:4)
原始XML不知道除>
,<
和`&
之外的任何命名实体。所有其他实体都需要声明为数字字符代码,否则您需要在Doctype或DTD中指定实体。
{DT}中定义了…
实体,所有浏览器都能理解它,但大多数其他XML DTD都没有定义它。
一般情况下,如果您正在使用DTD,大多数情况下它将是您无法控制的第三方DTD,因此您无法向其添加实体。您也不希望将实体ad-hoc添加到您自己的DTD中。
我也会避免将实体声明放入doctype标头中。除非你在文档中一遍又一遍地重复相同的实体,否则它不会增加太多不必要的毛茸茸。
因此我的建议只是使用数字实体。
因此,您可以使用字符代码实体…
或…
代替…
。这同样适用于任何其他非ascii字符。
另一个选择当然是使用UTF-8或UTF-16字符编码输出XML,这完全不需要任何实体。这可能是也可能不是你的选择,但如果可能的话,这可能是最好的选择。
如果您有一个特定字符,您需要找到数字实体代码,网上有很多地方可以找到它们的参考。以下是维基百科的内容:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
希望有所帮助。
答案 2 :(得分:0)
XML只能理解几个字符实体'"&<>
。任何事都会导致文件无效。您可以尝试使用
<!DOCTYPE text [ <!ENTITY hellip "…"> ]>