程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#發現之旅第十講 文檔對象模型

C#發現之旅第十講 文檔對象模型

編輯:關於C#

為了讓大家更深入的了解和使用C#,我們將開始這一系列的主題為“C#發現之旅 ”的技術講座。考慮到各位大多是進行WEB數據庫開發的,而所謂發現就是發現我們所 不熟悉的領域,因此本系列講座內容將是C#在WEB數據庫開發以外的應用。目前規劃的主要內 容是圖形開發和XML開發,並計劃編排了多個課程。在未來的C#發現之旅中,我們按照由淺入 深,循序漸進的步驟,一起探索和發現C#的其他未知的領域,更深入的理解和掌握使用C#進 行軟件開發,拓寬我們的視野,增強我們的軟件開發綜合能力。

課程說明

本 課程專門講述文檔對象模型的概念,理論性比較強,需要仔細思考,而且沒有演示程序,本課 程是C#發現之旅系列課程的終結篇,不過不排除我今後推出C#發現之旅續集的可能性。

文檔對象模型定義

文檔對象模型英文名為 Document Object Model , 簡稱 DOM,它是一種比較重要的軟件設計模式,不是編程技巧。可以這麼說,平生不認DOM,便稱 英雄也枉然,大家應當多多了解它的能力。

文檔對象模型是面向對象編程技術的集中 體現,若沒有完整的面向對象編程思想,是不可能理解和開發文檔對象模型,若開發者能開 發出文檔對象模型,那就說明他/她比較完整的理解和掌握了面向對象編程思想。

W3C 國際組織對文檔對象模型是這樣定義的(摘自 http://www.w3.org/DOM/ )

The Document Object Model is a platform- and language-neutral interface that will allow programs and scripts to dynamically access and update the content, structure and style of documents. The document can be further processed and the results of that processing can be incorporated back into the presented page. This is an overview of DOM-related materials here at W3C and around the web.

以 我個人的英文水平翻譯如下

文檔對象模型是一種平台或語言中立的接口,程序或腳本 能利用它來訪問和更新結構化的文檔。這些文檔可以被進一步的處理,處理結果可以組成一 個有效頁面。這是W3C對web上的文檔對象模型原理的一般看法。

文檔

我們來 逐步理解這個定義。首先什麼是文檔。文檔就是以一種結構組織在一起的數據包。比如MS Word 文檔就是一種文檔,它包含了很多字符,圖片,段落數據,並使用特定的組織結構保存 在一個二進制文件中。 比如HTML文檔,它也包含了文字,圖片,鏈接,表單數據,並可以按 照公開的HTML語法組成一種層次結構保存在一個字符串或文本文件中。

結構化文檔

其次,什麼是結構化的文檔,很多文檔它的內容組織呈現一種層次化的結構。即它的 內容抽象化可以組成一種樹狀結構,比如HTML文檔,XML文檔。

對於普通的文本文檔 ,從開發者看來,它就是一個字符串,其中各個字符或子字符串之間是沒有相互關系的。此 時普通文本文檔就不是結構化的文檔,若將某種支持層次結構的語法分析強加到這個文本文 檔時,則該文本文檔就成了一個層次化的文檔。

HTML文檔若沒有進行HTML語法解釋, 則它就是一個平淡無奇的純文本文檔,就是一個普通的字符串,若將HTML語法強加到這個字 符串,則這個純文本文檔立即成為具有相當復雜度的結構化文檔。同樣的道理,XML文件, SQL語句等純文本文檔,在它沒有解釋前是一個普通的字符串,解釋之後就成為大有用途的 XMLDOM,SQLDOM。

編程接口

DOM是一種接口或平台,對於軟件開發者來說,這 種所謂的接口或平台就是編程接口(API),API有很多種,有直接調用函數的接口方式,比 如傳統Win32API函數,還有一種是暴露可編程對象,編程對象有公開的屬性方法或事件,比 如COM接口或.NET類庫接口。還有基於WEB的WebService的編程接口。一般而言,對於DOM,編 程接口就表現為可編程對象的編程接口,就是DOM向外發布若干個可編程對象,別的應用程序 或者腳本語言可以調用這些可編程對象的公開成員。

DOM的一個重要特性就是應用程 序或者腳本程序能利用它來訪問和更新結構化文檔。這個意思是說,DOM向外提供若干個可編 程對象,這些對象內部使用種種手段,保證它和結構化文檔中的某個部分保持對應關系,特 別是對象的屬性和文檔片斷的屬性保持映射關系。而外部程序獲得可編程對象的屬性,經過 DOM內部的映射關系,實際上就等價於獲得某個文檔片斷的某個屬性,外部程序修改可編程對 象的屬性,經過內部的映射關系,最終導致某個文檔片斷的屬性的修改。因此DOM是應用軟件 和結構化文檔之間的代理,應用軟件使用DOM透視出文檔的內容,也通過DOM“隔山打牛 ”的方式修改文檔內容。

有效頁面

最後結構化文檔處理後,可以形成一 種有效頁面,也就是結構化文檔可以展示在用戶界面上。一般的應用程序借助DOM,可以在用 戶界面上繪制結構化文檔的內容。比如WEB浏覽器,借助HTML DOM,在用戶界面上繪制出HTML 文檔的樣式。一些結構化文檔沒有用戶界面,比如XML文檔,但它具有可編程用戶界面,其他 的應用系統可以使用這個可編程用戶界面來獲知XML文檔中到底有什麼內容。

文檔對 象模型可以是語言中立的,也就是說跨語言跨平台,比如HTML和XML的文檔對象模型,在W3C 國際標准組織的努力下,已經是最典型的跨語言跨平台的文檔對象模型,我們可以使用任何 平台和語言來使用相同的方式和接口來訪問XML和HTML,比如無論是Linux下的JAVA,Windows 下的.NET,VB或各種浏覽器中的JavaScript,甚至是MS Office 中的VBA,他們訪問XML DOM 的過程必然是類似的,很容易使用相同的處理流程來實現相同的功能。這樣做的好處就是大 大的方便程序的移植和各種系統之間交流數據。

可以這麼認為,若文檔具有生命,則 它在保存在文件時,它就處於休眠狀態,就差不多是死的,但一旦被DOM附體,它被喚醒了, 就是活的,可以任由應用軟件調遣,可以發揮任何應有的功能。

以上是我個人對文檔 對象模型的理論認識,接下來說說如何在軟件開發中理解文檔對象模型。

理解文檔對 象模型

文檔對象模型是一種規范,在微軟.NET框架類庫中實現了兩種DOM,CodeDom和 XMLDom。名稱空間 System.CodeDom下定義了CodeDom,名稱空間System.Xml下定義了XML Dom ,這裡使用大家比較熟悉的XML Dom 來講解一番。

XmlDom結構研究

這個圖是 XML文檔和XML對象之間的映射關系圖。

大家經過以 前的課程的學習,已經掌握了基本的XML語法,因此這裡不再詳細說明這個XML文檔的語法結 構了。在這個映射關系圖中,我們使用XmlDocument對象來影射整個XML文檔;使用 XmlDeclaration來影射”<? ?>”定義的XML聲明,;類似的我們使用 XmlElement對象來影射一個XML元素;使用XmlText來影射XML文檔中的純文本數據;使用 XmlAttribute來影射XML屬性片斷;使用XmlComment來影射XML注釋。

經過上述影射, 開發者可以通過編程調用各個XML對象來修改XML文檔中對應的部分。比如我們調用XmlText類 型的Value屬性,就能很方便的獲得和修改XML文檔中的純文本數據片斷。

XmlDocument類型定義了很多以Create開頭的函數來創建一個新的Xml對象,比如我們 可以使用CreateElement函數創建一個XmlElement對象,然後添加到某個已有的XmlElement的 ChildNodes列表中,這樣的操作就相當於向XML文檔新增元素的操作;我們也可以刪除某個已 有的XmlElement的ChildNodes中的對象,這相當於從XML文檔中刪除了一個片斷。

通 過編程對象和XML文檔的映射關系,我們就將操作XML文檔的操作轉化為對一個個編程對象的 操作。我們就能比較方便的使用編程來處理具有復雜語法結構的XML文檔。

考察 XmlDocuement,XmlElement,XmlText等等XML文檔組成元素,可以發現它們都是從XmlNode這 種類型派生的,XmlNode中定義了Xml對象通用的編程接口,而其他Xml類型都從XmlNode派生 的,並根據各自對應的XML片斷類型進行了擴展。這樣我們可以很方便的使用XmlNode作為強 類型來遍歷XML文檔。

事實上,名稱空間System.Xml下面存在比較復雜的對象繼承關 系,比如存在這樣的派生關系鏈表XmlNode->XmlLinkedNode->XmlCharacterData- >XmlText。為什麼要設計如此的長的派生鏈表,每層應當實現什麼樣的功能,預留什麼樣 的接口,每層又如何擴展上層類型的成員。所有的這些都是考驗開發者的面向對象編程技術 的基本功和軟件設計思想,因此若一個開發者能理解和設計比較復雜而合理的DOM,則此人必 是軟件設計高手。

一般情況下我們進行編程,同一個列表中保存的對象,它們的類型 是一樣的,可以放心大膽的使用強制類型轉換來獲得列表中的任意元素。但在XML文檔對象類 型中,同一個列表中的對象類型可能不一致,無條件的強制類型轉換是不可靠的,容易出錯 ,因此強制轉換前需要進行類型判斷。而且這種現象普遍存在於其他的文檔對象模型中,比 如HMTLDOM中,一個HTML節點的子節點也存在類似情況,因此針對文檔對象模型編程時需要注 意這點。但由於所有的Xml對象類型都是從XmlNode上派生的,因此我們可以可靠的使用 XmlNode類型來遍歷XML文檔結構。

XmlDom中包含了一個以XmlReader為基礎的XML文檔 解析器,我們調用XmlDocument的Load方法,系統就能從一個文件中加載文本數據並解析,自 動構造出一個以XmlDocument為根節點的Xml對象樹狀結構。XmlDom中還包含了一個以 XmlWriter為基礎的XML文檔書寫器,當我們修改了XML對象樹狀結構後,調用XmlDocument的 Save方法就能把修改過的Xml文檔保存到一個文件中。這樣就完成了對Xml文檔的修改。

如果我們不用XMLDOM,我們如何編程來訪問XML文檔?很顯然,這時的XML文檔就是一 個字符串,我們需要對這個包含XML內容的字符串進行很復雜的字符串操作,軟件開發過程復 雜而低效率,XML技術由於難以開發和使用而必然得不到推廣。

DOM概念內涵

經過XMLDOM的研究,我們可以歸納出DOM的一些基本的編程特性:

所有的文檔對象類 型都是從一個基礎類型派生的,文檔對象類型都在基礎類型上實現了各種特性。

每個 文檔對象都映射了文檔中某個片斷,修改文檔對象就等價於修改文檔片斷本身。

文檔 對象可以有子節點,由此構成一個多層次對象樹狀結構。

存在一個頂級對象,用來表 示整個文檔。可以宏觀控制整個文檔,也是應用程序訪問文檔對象樹狀結構的唯一入口。

文檔對象模型是可編程的,應用程序通過訪問文檔對象模型來訪問結構化文檔。

大部分類型的DOM可以將整個文檔結構保存到一個文件中,也可以從一個文件中再現 整個文檔結構。這算對象序列化。但也可能有例外。

我們可以發現,其他的DOM都基 本上實現了上述編程特性,比如名稱空間System.CodeDom支持下的CodeDom,HTML DOM。

DOM概念外延

XMLDOM是嚴謹的DOM的編程特性,但我們在實際開發應用中,可 以根據各種需要進行簡化,開發各種不夠嚴謹的DOM。 比如在微軟.NET標准庫中,存在著許 多不嚴謹的DOM結構。比如名稱空間System.IO下的FileSystemInfo ,FileInfo, DirectoryInfo組成了文件系統DOM;名稱空間System.Reflection下的類型組成了以Assembly 為根節點的程序集DOM;名稱空間System.Windows.Forms下的類型組成了以Form為文檔對象, 以Control為基礎類型的WinFormDOM;名稱空間System.Web.UI及其子名稱空間下的類型組成 了以Page為文檔對象,以Control為基礎類型的ASP.NET頁面DOM。可以說,一般的對象樹狀結 構都可以看作不嚴謹的DOM結構。

我們學習了XMLDOM後,就可以模仿著設計自己的DOM ,在開源網站 http://sourceforge.net 上,使用關鍵字 DOM 進行查找,會找出很多開源項 目,這些開源項目大多都和各種各樣的DOM有關系。

文檔就是數據,DOM處理文檔,實 際上就是處理數據,因此更進一步,我們開發開發各種應用系統中,都可以借鑒一下DOM的設 計思想,比如開發WinForm或ASP.NET中,這些用戶界面控件時也可以看作DOM。做電子病歷時 ,可以設計出電子病歷文檔對象模型,做客戶關系管理系統時,可以設計出客戶文檔對象模 型。總之做XX系統時,可以考慮設計出XX文檔對象模型。

小結

文檔對象模型 是一種比較復雜的軟件設計技術,但它功能強大,層次分明,邏輯清晰,好的文檔對象模型 合情合理,符合人們想當然的思想,是業務邏輯數據的高度抽象。大家應當好好學習,多多 研究學習學習,這對提高軟件設計能力,樹立自己的面向對象的編程思想都大有好處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved