文件物件模型(Document Object Model,DOM)是 W3C 制定的標準介面,定義程式與腳本如何動態存取、更新文件的內容、結構與樣式。DOM 將文件呈現為可程式化的物件樹狀結構,應用程式透過操作這些物件間接操作文件,處理結果可回寫呈現為有效頁面。DOM 的核心特性:平台中立、語言中立、可程式化、支援序列化/反序列化。
文件是以特定結構組織的資料封裝(如 Word 二進位檔、HTML 文字檔)。結構化文件具備層次化結構,抽象後可形成樹狀模型(HTML、XML)。純文字檔若無語法解析則無結構,經語法解析器賦予語義後轉為結構化文件(如 HTML DOM、XML DOM)。
DOM 以可程式化物件形式暴露 API。每個 DOM 物件對應文件片段,物件屬性與文件片段屬性保持映射關係。應用程式讀寫物件屬性,經 DOM 內部映射實際讀寫文件片段。DOM 扮演應用軟體與結構化文件間的「代理」角色,實現「隔山打牛」式的文件操作。
處理後的結構化文件可渲染為有效頁面(瀏覽器繪製 HTML、XML 可程式化存取)。標準化 DOM(HTML/XML DOM)使 Java、.NET、JavaScript、VBA 等異構環境以相同流程操作文件,極大便利移植與資料交換。文件靜態存檔如「休眠」,經 DOM 載入即「喚醒」賦予生命。
.NET Framework 在 System.Xml 命名空間實作標準 XML DOM。
XmlDocument:對應整份 XML 文件(根節點)。XmlDeclaration:對應 <?xml ...?> 宣告。XmlElement:對應 XML 元素(標籤)。XmlText:對應純文字內容。XmlAttribute:對應屬性。XmlComment:對應註解。
開發者操作這些物件(如修改 XmlText.Value)即同步修改文件對應片段。XmlDocument 提供 CreateElement、CreateAttribute 等工廠方法建立新節點,掛入 ChildNodes 即完成文件修改;移除節點同理。
所有 XML DOM 類別繼承自 XmlNode,定義通用介面(ParentNode、ChildNodes、Attributes、Value、AppendChild、RemoveChild 等)。衍生類別再擴展特定功能:
XmlNode → XmlLinkedNode → XmlCharacterData → XmlText
XmlNode → XmlLinkedNode → XmlCharacterData → XmlComment
XmlNode → XmlAttribute
XmlNode → XmlElement
此多層繼承鏈體現物件導向設計功力:每層封裝特定行為(雙向連結、字元資料操作等),預留擴展點。開發者可安全以 XmlNode 強型別遍歷樹狀結構,但需注意同一 ChildNodes 集合中節點型別可能不同,強制轉型前必須型別判斷(is/as)。
XmlDocument.Load() 內建以 XmlReader 為基礎的解析器,從檔案/串流讀取文字並自動建構 XmlDocument 為根的物件樹。XmlDocument.Save() 內建以 XmlWriter 為基礎的書寫器,將物件樹序列化為 XML 文字輸出至檔案/串流。若無 DOM,開發者需自行對 XML 字串進行複雜字串剖析,開發極度困難且錯誤率高,XML 技術將難以普及。
XmlDocument)代表整份文件,為應用程式唯一存取入口。嚴格 DOM 複雜,實務上常簡化應用。.NET 基礎類庫中存在多種「非嚴格 DOM」結構:
System.IO 下 DirectoryInfo(資料夾節點)、FileInfo(檔案節點),基類 FileSystemInfo。System.Reflection 下 Assembly(根)、Module、Type、MemberInfo 等。System.Windows.Forms 下 Form(文件)、Control(基礎節點)。System.Web.UI 下 Page(文件)、Control(基礎節點)。System.CodeDom 以物件樹表達程式碼結構,支援動態生成原始碼。凡呈現樹狀物件結構、節點具屬性與子節點集合、支援遍歷與修改者,皆可視為廣義 DOM。掌握 DOM 設計思想,可應用於電子病歷 DOM、CRM 客戶 DOM 等領域模型建構,提昇軟體設計抽象層次。
DOM 是兼具理論深度與實務價值的軟體設計技術。優秀的 DOM 設計邏輯清晰、符合直覺、為業務資料的高度抽象。深入研習 DOM 不僅能掌握 XML/HTML 處理核心技術,更能鍛鍊物件導向設計基本功,拓寬架構視野。本講為「C# 發現之旅」系列終結篇,期許讀者持續探索 C# 未知領域,精進軟體開發綜合能力。