2011-11-28 85 views
0

我正在尝试获取PHP DOM文档的根节点。这通常是通过做这样做:从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标记!我猜这是因为奇怪的字符<! - 是否有正确返回根节点?

+0

[它被称为“元素类型名称”,dammit。](http://www.flightlab.com/~joe/sgml/faq-not 。文本)。 :-)'DOCTYPE'声明是一个SGML构造,它不是文档语法本身的一部分。根*元素*确实是'html'元素。一般来说,SGML声明看起来像'',其中'****'是一些关键字,而这些* *不是文档树的一部分。可以出现在顶层的唯一声明是doctype声明,注释声明'',符号声明(也许标记的部分)。 –

回答

2

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

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

+0

我试图使用doctype对象来重建doctype,但它不会让我回到一切组件。但我现在明白,doctype不是根节点。我只是坚持我的正则表达式来恢复文档类型。 – Abs

0

DOCTYPE实际上并不是一个节点,它肯定不是根节点。尝试$doc->doctype

+2

DOCTYPE是一个节点(他从DOMNode继承):'$ doc-> firstChild - > ...-> nodeType === XML_DOCUMENT_TYPE_NODE'。 [W3:Node :: DOCUMENT_TYPE_NODE](http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247) – Saxoier

0

前段时间我遇到了这个问题,这是因为我实际上并不想在那里有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标签在这种情况下,我的答案,让别人通过谷歌找到它:)