2017-02-26 175 views
1

我有一个非常简单的实现,它引入一个XML测试位并尝试使用DOMDocument对其进行验证。在测试中,它能够通过LoadHTML()调用,但只要我尝试并运行validate(),浏览器就会永久挂起并且不会加载。下面的代码:在XML上使用DOMDocument验证()导致无限加载

$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

那么,为什么你想用'loadHTML'而不是'loadXML'解析XML? –

回答

1

看来,如果你想验证内容加载loadHTML,你需要DOCTYPEdeclaration(如果没有它,你就会得到一个不定式循环)。例如,下面的代码工作,并打印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

+0

这是有道理的,我已经切换到使用loadXML建议并现在'失败'。不过,我很好奇,为什么这不能验证?我期待着取得成功。 – carbide20

+1

@ carbide20由于您没有指定'dtd',因此失败。验证是检查你的xml是否基于你的'dtd'的过程。查看https://www.w3schools.com/xml/xml_dtd.asp。 –

+0

现在我明白了,谢谢你解释这个,花时间回答! – carbide20