HTML+DOM與XML+DOM之間的區別與聯繫

像在座閱讀此文的讀者一樣,由於自身的興趣,我對 AJAX 編程方面的研究是持續不斷的。隨着該領域的深入,我越來越發覺所謂的瀏覽器 DOM,即 HTML DOM,是一個非常值得關注的點。在與資深的技術人員們交換意見的時候,也曾談到過這樣的觀點,就是關於 DOM Level1,我們仍然缺乏具有深度的、規範的輔助讀物,而且網絡上搜索也比較少見。我們真正的想法在於,工作的時候我們不僅僅是去翻閱工具庫/API 那些高級的抽象內容。

爲此我打算在本文中撥開其中的雲霧,如果您正好想用用“ DOM-腳本”做很多的事情,那麼接下來課題內容便適合您了,也可以當作拋磚引玉的 DOM 介紹。本文內容的主題便是,爲什麼開發者要認爲“DOM Level 1規範的架構”是至關重要的,其突出的重要性在哪裏等等,以及還有 HTML DOM 和  XML DOM之間微妙的區別及內在的聯繫。

W3C  所制訂的 DOM Level 分爲兩大模塊:Core 和 HTML。第一個大模塊是 Core 核心,W3C 規範是這樣描述 Core 的:

“滿足軟件開發者和 Web 腳本編寫者,訪問和操控產品項目中包含的可解析的 HTML 和 XML  內容。”
"sufficicent to allow software developers and web script authora toaccess and mainipulate parsed HTML and XML content inside conformingproducts."

第二個爲 HTML 模塊,其規範描述是:

“HTML之中特定元素的功能,和恰到好處的、易用的、針對常見性任務的HTML文檔操作機制。”
"functionality that depends on specific elements defined in HTML"

以上可見兩者的重要性。同時 HTML 模塊的意義也在於,解決了向後兼容的問題,這在當今符合 DOM Level 1 的瀏覽器中已經可以提供適應的解決方案。

按照這樣的說法,如果您仍然不能理解上述的要義,我們則可以這樣認爲,HTML文檔可以使用 Core API 和 HTML API 兩者;而 XML 文檔只能使用 Core API。換句話說,HTML 與 XML 重疊的部分有 Core API,而 HTM LAPI 則是不能共享的部分,顧名思義限於 HTML 文檔所使用。這是我們認識 Core/HTML 的初步認識。

理解DOM Level 1 Core

理解DOM Level 1Core之要義實質在於將Core看待成爲許多節點(Nodes)而組成的文檔(Document),也就是說,此文檔結構中可允許存在着大量的條目項,其每一項都可理解爲“節點”。討論該結構可以以兩個方面入手:一、一切皆是節點對象(NodeObject,扁平化的角度去理解,flattened view,乃適合於多態下的接口);二、每個對象繼承於基類節點,實現了節點的接口(interface,OO繼承的角度去理解);

請觀察一下這段HTML:


  1. <divid="myDiv">Hello World</div>


這是一個閉合的 div 標籤。從 DOM Level 1 的層面來分析可以有以下幾點內容:

  • 標籤 div 可作爲“節點對象 Node Object(扁平化角度,前面已述)”,或者元素對象 Element OBject (繼承的角度 - 元素繼承於 Node)。

  • 節點屬性id也可作爲“節點對象 Node Object(扁平化角度)”,或者屬性對象 Attr. OBject(繼承的角度 - Attr繼承於 Node)。

  • 文本“Hello world”也可作爲“節點對象 Node Object(扁平化角度)”,字符串對象 CharacterData對象(繼承的角度 - CharacterData 繼承於 Node),Text 文本對象(繼承的角度 - Tex t繼承於 CharacterData)。

稍微歸納一下,就是 DOM 1Core 部分中一切皆是節點,節點以及其接口都可實現在每個對象身上(從繼承的角度理解出發),實現了節點接口纔可以有節點的屬性、方法。——這是我們理解的前提。然後,根據特定的節點類型的不同,其接口的屬性和方法都是不同的,視乎 DOM 對該節點的設計而定。

理解 DOM Level 1 HTML

我們日常工作的時候,都跟 HTML 文檔打交道,其實就是屬於 W3C 所規定的 DOM Level 1HTML 模塊內的那些處理工作。HTML DOM 的特性和方法不是標準的 DOM 實現,是專門針對 HTML 同時也讓一些 DOM 操作變的更加簡便。HTML 模塊集中表現在 HTMLElement 接口上,即爲全體元素類型的對象所實現的接口。就該文討論的範圍而言,HTMLElement 接口的參與形式與上述的 Node 節點接口非常地相似。一旦引入了 OO 設計觀,只要實現了 HTMLElement 接口的對象,就可以定義它爲元素了。一份 HTML 文檔有相當多的都是元素,當然還有,表示文檔本身的 HTMLDocument 和集合容器 HTMLCollection 等等。

因此,要準確理解 DOM 1HTML的模塊,必須認識其接口是基於元素的(Element-based),而不是基於節點的(Node-based)。那樣的話,元素方式與節點方式到底又有什麼區別呢(Element v.s Node),應該如何界定兩者呢?例如節點屬性(properties ofelements),當在“基於元素”的語境中,就是“屬性(attributes)”,並非獨立的節點對象。——儘管按照某個角度講,元素是節點的一種特例,我們仍可保留“節點”這一說法,一個標籤(tag)便是一個 “節點”。假如我們要得到 id 屬性的字符串的值是什麼,採用DOM 1Core 的方式就是,


[javascript]view plaincopy
  1. myElement.attributes["id"].value; // 從Node接口提供的屬性


等於下面的方法:


[javascript]view plaincopy
  1. myElement.getAttributes("id"); // 從Element實現的方法返回


但使用 DOM 1 HTML 方式的話,我們僅僅如此:


[javascript]view plaincopy
  1. myElement.id;  


這般就可以獲取 id 了。此時此刻,你可能會認爲,XML 文檔本身就不一定缺省有 id 的屬性,而因爲有你所說的 HTMLElement.id 屬性預先定義在 API 中,當然 HTML 中的每個元素就有 id 的屬性啦!?——這裏的意思沒有錯,也不妨礙我們的理解。的確全體的 HTML 元素均有 id一項的屬性,不管 HTMLDivElement/HTMLImageElement/……

Core or HTML Module?

既然這樣,那我應該使用Core的API,還是 HTML 模塊的 API?對於 HTML 的文檔來說,用 Core 或 HTML Moduel 實際差別不大。本來我們一直都不太強調這種界定,以致忽略了它們細微的差異。如果我們覺得還是模棱兩可的話,我們可進一步查探它們的明細。個人認爲處理XHTML並使用 Core API 這樣更能夠說明 XHTML 的 “X”,即表明這份 HTML 就是一份標準的 XML 文檔,以便與原有 HTML 4.1 從語義上區別開來。但請記住,當處理一份 XM L結構的文檔的時候,自然而然就是採用 Core 去處理。通過XHMLHttpRequest 請求執行後所返回的r esponseXML 結果,那隻能使用 Core 的API去處理分析,就不能夠採用 HTML 的了。

小結

通過文本開發者應該明白到,HTML DOM 與 XML DOM 之間,既有區別,又有聯繫。一般而言,除了上述比較外,須值得一提的就是,HTML 是可以允許不 Well-Form 的,XML則不然。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章