PHP DomDocument使用破损的XML数据加载

4

如何处理XML文件中的损坏数据?例如,如果我有以下XML代码:

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

我正在尝试做的事情是:
 $doc = new DOMDocument();
 $doc->validateOnParse = false;
 $doc->formatOutput = false;
 $doc->load(...xml');

这段代码与未知实体有关,导致其运行失败。请注意,由于软件的写作方式,我无法使用CDATA。我正在编写一个读写XML的模块,有时用户会插入不当文本。

我注意到DOMDocument->loadHTML()可以很好地进行编码,但我该如何继续呢?


loadHTML()有什么问题吗?据我所知,它是为这种情况而设计的。 - Pekka
你的“continue from there”是什么意思? - philfreo
实际生成XML的软件存在严重问题,您应该尝试更改它或联系能够解决问题的人。 - ty812
3个回答

1
使用htmlspecialchars将特殊的xml字符序列化,然后再将输入推入xml/xhtml dom中。尽管它的名称以"html"为前缀,但基于它所替换的唯一字符,它确实非常适用于xml数据序列化。

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);

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接