【问题标题】:How to remove invalid XML charactes from document with PHP如何使用 PHP 从文档中删除无效的 XML 字符
【发布时间】:2012-04-10 20:09:26
【问题描述】:

我尝试生成一个大约 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);
    

    这里的问题是我不太确定这是有效的正则表达式,因为我收到内部服务器错误,因为我们的 apache 中启用了 mod 安全性。

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

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

  4. 我尝试使用逐个字符替换,但这不适用于我的文件,因为我有 230k 行.. 即使我替换了我遇到问题的特定标签在 php 中触发 max_execution_time 指令,我的脚本被杀死。

目前我的解决方案是手动清除此无效字符的数据库记录,但这现在是解决我的问题的正确和正确的解决方案,因为将来此脚本将用于自动执行此导出并且手动编辑不是选项或演讲主题。

【问题讨论】:

    标签: php xml


    【解决方案1】:

    我首先会坚持 XML Nanny 提供的信息:

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

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

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

    Firefox 可能会接受这些。

    【讨论】:

    • 感谢您对我的问题的回答和更正。现在一切都很好。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2023-03-16
      • 2011-05-12
      相关资源
      最近更新 更多