4

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

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

我正在尝试做:

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

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

我注意到 DOMDocument->loadHTML() 很好地编码了所有内容,但是我怎么能从那里继续呢?

4

3 回答 3

1

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

于 2009-11-08T06:41:19.510 回答
0

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

于 2009-11-07T07:58:49.760 回答
0

也许您可以使用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);
于 2009-11-08T03:45:59.147 回答