我使用DOMDocument类在PHP中生成了一个XML文件,数据是从MySQL数据库中获取的。很多数据都包含HTML标记,但我已将所有数据都包含在CDATA部分中。
首先,文件有很多编码错误,但是在将文件放入文件之前通过utf8_encode()运行所有内容似乎修复了除一个之外的所有错误。
以下是我现在的错误:
error on line 5113 at column 450: Input is not proper UTF-8, indicate encoding !
Bytes: 0x14 0x31 0x30 0x30
我在这里发现了一些类似错误的帖子,但没有一个解决了我的问题,或建议使用utf_encode()。以下是似乎触发错误的部分:
...quiet portable package. ]]></Summary><Features><![CDATA[The EF4500iSE was designed for maximum fuel...
错误似乎在CDATA [和The之间],虽然我看不到它之间的任何字符,但该文件中的每个其他CDATA块都是相同的。如果我删除整个Features元素及其内容,则文件加载正常。
以下是文件的链接:http://test.hhdev.hothousemarketing.com/inventory.xml
答案 0 :(得分:0)
问题最终成为CDATA标签中存在的非ASCII字符,正如Colin在问题评论中指出的那样。
我急于解决这个问题所以我只是使用了暴力方法并且除了utf8_encode()之外还通过正则表达式替换了所有内容,我用过: $ output = preg_replace('/ [^(\ x20- \ x7F)] * /','',$ output); 我在这里找到了这个:http://www.stemkoski.com/php-remove-non-ascii-characters-from-a-string/
感谢科林和弗朗西斯的贡献。
答案 1 :(得分:0)
有些字符在XML中是不允许的,即使在CDATA部分,甚至是实体编码也是如此。
您可以在UTF-8字符串(未经测试)上使用它:
$xml_legal_chars = preg_replace('/[\x{00}-\x{08}\x{0B}\x{0C}\x{0E}-\x{1F}\x{D800}-\x{DFFF}\x{FFFE}\x{FFFF}]/u', '', $utf8string);