2011-11-28 86 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標籤在這種情況下,我的答案,讓別人通過谷歌找到它:)