从DOM Document类获取根节点


Get root node from DOM Document class

我正在尝试获取PHP DOM文档的根节点。这通常是通过做这样的事情来完成的:

$doc->documentElement;

但是,在包含doctype:的HTML字符串上尝试此操作

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">...

并且被加载到DOM文档对象中,比如:

$doc = new DOMDocument();
$doc->loadHTML($html);

返回根节点作为html标记,而不是doctype标记!我猜这是因为奇怪的字符<!-是否有正确返回根节点的方法?

Doctype不是根节点,html是根节点。Doctype只是一个Doctype声明,它告诉浏览器文件的其余部分是什么。

也许您可以使用DOMDocument::doctype?($doc -> doctype(

DOCTYPE实际上不是一个节点,它当然也不是根节点。尝试$doc->doctype

我前段时间遇到了这个问题,因为我实际上根本不想让DOCTYPE出现在那里。我使用的是代码片段,很难让返回的值不被DOCTYPE污染,并在不应该添加的时候添加HTML标记。

我将在这里给出一个答案,以防你遇到和我一样的问题。如果您有更新版本的php,我的解决方案实际上可以防止添加任何DOCTYPE元素。我相信这是PHP v5.4及以上版本的最低版本,也是LibXML v2.7.8的最低版本。如果这两个版本都是最新的,那么只需在DOMDocument对象的loadHTML实现的方法调用中添加一个常量标志即可。常数是LIBXML_HTML_NODEFDTD,它是这样使用的。。。。

$doc = new DOMDocument();
$doc->loadHTML($someContentString, LIBXML_HTML_NODEFDTD);

这样就根本不需要额外的解析,而且你可以在没有DOCTYPE问题的情况下继续你的生活。。。除非你需要DOCTYPE标签,在这种情况下,我的答案并让其他人通过谷歌找到:(