如何使用PHP从文档中删除无效的XML字符

时间:2012-04-10 20:09:26

标签: php xml

我尝试生成一个大约23到30 MB的XML文档,当我用Firefox打开它时我会收到

XML Parsing Error: not well-formed
Location: file:///Users/User/Downloads/export(2).xml
Line Number 137725, Column 1343:

之后我尝试使用XML Nanny验证文档,并收到以下错误:

Invalid Character (Unicode: 0xB)

在几(13)行:137725,137738,137751,137764,137777,137790,137803,137816,146834,189949,193444,193457,193470

我尝试了几种“解决方案”,其中包括:

  1. 正则表达式:

    preg_replace(
      '/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+/'
      , ' ', $data->Description);
    

    这里的问题是我不太确定这是有效的RegEx,因为我的apache启用了mod安全性,因此我收到了内部服务器错误。

  2. 我尝试使用BOM保存我的UTF-8文件,但这是绝望的尝试

  3. 我尝试将iconv与'UTF-8 // IGNORE'一起使用,但这没有帮助

  4. 我尝试过逐字符替换字符,但这对我的文件不起作用,因为我有230k行...即使我替换了我有问题的特定标签我也是在php中触发max_execution_time指令并且我的脚本被终止。

  5. 现在我的解决方案是手动清除这些无效字符的数据库记录,但现在这是我的问题的正确和正确的解决方案,因为将来这个脚本将用于自动化这个导出和手动编辑不是选项或主题。

2 个答案:

答案 0 :(得分:2)

我首先要坚持使用XML Nanny提供的信息:

Invalid Character (Unicode: 0xB) (several lines)

0xB是控制字符范围内的字符,但XML文档中只允许非常有限的控制字符。我建议你开始用数字实体替换那些,然后再试一次:

$xml = strtr($xml, array("\x0B" => ""));

Firefox可能会接受这些。

答案 1 :(得分:1)

我有时会遇到类似的问题。我所做的是使用base64encode在通过XML发送之前对数据进行加密,然后在接收之后,我对其进行了解码。告诉我这是否适合你。或者如果我没有清楚地理解你的问题?