【问题标题】:PHP DomDocument XML Load with Broken XML Data带有损坏的 XML 数据的 PHP DomDocument XML 加载
【发布时间】:2010-12-13 19:21:38
【问题描述】:

您如何处理 XML 文件中的损坏数据?例如,如果我有

<text>Some &improper; text here.</text>

我正在努力:

 $doc = new DOMDocument();
 $doc->validateOnParse = false;
 $doc->formatOutput = false;
 $doc->load(...xml');

它惨遭失败,因为有一个未知实体。注意,由于软件的编写方式,我不能使用 CDATA。我正在编写一个读写 XML 的模块,有时用户会插入不正确的文本。

我注意到 DOMDocument->loadHTML() 可以很好地编码所有内容,但我该如何从那里继续呢?

【问题讨论】:

  • loadHTML() 有什么问题?据我了解,它是为这样的情况而设计的。
  • “从那里继续”是什么意思?
  • 实际生成 XML 的软件已严重损坏,您应该尝试更改它 - 或联系有能力的人。

标签: php xml parsing syntax entities


【解决方案1】:

在将输入推送到您的 xml/xhtml dom 之前,使用 htmlspecialchars 序列化特殊的 xml 字符。虽然它的名称以“html”为前缀,但基于它替换的唯一字符,它对于 xml 数据序列化非常有用。

【讨论】:

    【解决方案2】:

    也许您可以使用 preg_replace_callback 为您处理实体的繁重工作:

    http://php.net/manual/en/function.preg-replace-callback.php

    function fixEntities($data) {
        switch(substr($data, 1, strlen($data) - 2)) {
            case 'amp':
            case 'lt':
            case 'gt':
            case 'quot': // etc., etc., etc.
                return $data;
        }
        return '';
    }
    $xml = preg_replace_callback('/&([a-zA-Z0-9#]*);{1}/', 'fixEntities', $xml);
    

    【讨论】:

      【解决方案3】:

      如果您是编写 xml 的人,应该没有问题,因为您可以将任何用户输入编码为实体,然后再将其放入 xml。

      【讨论】:

        猜你喜欢
        • 2012-03-27
        • 2013-04-17
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 2012-05-06
        • 1970-01-01
        相关资源
        最近更新 更多