在XML上使用DOMDocument Validate()会导致无限负载

时间:2017-02-26 10:07:51

标签: php xml domdocument

我有一个非常简单的实现,它引入了XML的测试位并尝试使用DOMDocument对其进行验证。在测试中,它能够很好地完成LoadHTML()调用,但是一旦我尝试运行validate(),浏览器就会永远挂起并且不会加载。这是代码:

$content = '<?xml version="1.0" encoding="utf-8"?><mainElement></mainElement>';

$dom = new DOMDocument;
$dom->LoadHTML($content);

if (!$dom->validate()) {
    echo 'fail';
} else {
    echo 'success!';
}

1 个答案:

答案 0 :(得分:3)

如果你想验证用loadHTML加载的内容,你需要DOCTYPE declaration(没有它,你会得到一个不定式的循环)。例如,以下代码可以工作并打印fail

$content = "
    <!DOCTYPE html>
    <html>
    <body>
    Content of the document......
    </body>
    </html>
";

$dom = new DOMDocument();
$dom->loadHTML($content);

if (!$dom->validate()) {
    echo 'fail';
} else {
    echo 'success!';
}

对于XML 它更宽容(即使您没有声明dtd它也有效,但它返回false)。在您的情况下,您可以使用loadXML方法,您的代码将打印fail

使用php 7.0.13进行测试。