.NET Framework 的 DOM 解析器,將 XML 載入記憶體構建樹狀結構,支援完整的導航、查詢、修改、驗證功能。適合中小型 XML 文件 (建議 < 10MB),大文件請改用 XmlReader/XStreamingElement 流式處理。
| 屬性 | 用途 | 備註 |
|---|---|---|
DocumentElement | 取得根元素 | 最常用入口點 |
ChildNodes / FirstChild / LastChild | 子節點集合/首尾節點 | 繼承自 XmlNode |
InnerText / InnerXml / OuterXml | 文字內容 / 內部 XML / 含自身 XML | InnerText 會串聯所有子孫文字 |
Attributes | 屬性集合 (XmlAttributeCollection) | 支援索引器 [0] 或名稱 ["id"] |
Name / LocalName / NamespaceURI | 完整名稱 / 本地名稱 / 命名空間 URI | 處理命名空間必備 |
NodeType | 節點類型 (Element, Attribute, Text, Comment...) | 判斷節點種類 |
OwnerDocument | 所屬的 XmlDocument 實例 | 跨文檔操作參考 |
PreserveWhitespace | 是否保留空白文字節點 | 預設 false |
Schemas / SchemaInfo | 關聯 XSD 驗證 / 驗證結果 | 配合 Validate() 使用 |
XmlResolver | 外部資源解析器 (DTD、XSD、實體) | 安全性考量可設 null 禁用 |
CreateElement("tag") // 建立元素
CreateAttribute("attr") // 建立屬性
CreateTextNode("text") // 建立文字節點
CreateCDataSection("data") // 建立 CDATA
CreateComment("comment") // 建立註解
CreateXmlDeclaration("1.0","utf-8","yes") // 建立 XML 宣告
CreateDocumentFragment() // 建立文檔片段 (批量掛載高效)
SelectSingleNode("xpath") // 單一節點 (支援命名空間管理器)
SelectNodes("xpath") // 節點集合
GetElementById("id") // 依 ID 取得元素 (需 DTD/Schema 定義 ID 型別)
GetElementsByTagName("tag") // 依標籤名取得集合
AppendChild(node) // 附加子節點 (末尾) PrependChild(node) // 前置子節點 (開頭) InsertAfter(newNode, refNode) // 插入於參考節點之後 InsertBefore(newNode, refNode) // 插入於參考節點之前 ReplaceChild(newNode, oldNode) // 替換子節點 RemoveChild(node) / RemoveAll() // 移除 ImportNode(externalNode, deep) // 從其他文檔導入節點
Load("file.xml") / Load(stream) / Load(reader) / LoadXml("xml string")
Save("file.xml") / Save(stream) / Save(writer)
Validate(callback) // 對 Schemas 驗證 CreateNavigator() // 建立 XPathNavigator (唯讀、高效查詢) WriteTo(writer) / WriteContentTo(writer) // 輸出至 XmlWriter
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Data\books.xml"); // 或 doc.LoadXml(xmlString)
// 1. 查詢:取得第一本書的標題
XmlNode titleNode = doc.SelectSingleNode("/bookstore/book[1]/title");
Console.WriteLine(titleNode.InnerText); // "三國演義"
// 2. 修改:新增屬性
XmlAttribute isbnAttr = doc.CreateAttribute("isbn");
isbnAttr.Value = "978-7-101-001";
titleNode.Attributes.Append(isbnAttr);
// 3. 新增節點:在 bookstore 下加入新書
XmlElement newBook = doc.CreateElement("book");
newBook.SetAttribute("id", "3");
newBook.InnerXml = "紅樓夢 曹雪芹 59.0 ";
doc.DocumentElement.AppendChild(newBook);
// 4. 命名空間查詢
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("h", "https://example.com/ns");
XmlNode nsNode = doc.SelectSingleNode("//h:book", nsmgr);
// 5. 驗證 XSD
doc.Schemas.Add(null, @"C:\Schema\books.xsd");
doc.Validate((sender, e) => Console.WriteLine($"驗證錯誤: {e.Message}"));
// 6. 儲存 (高品質)
XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 };
using (XmlWriter writer = XmlWriter.Create(@"C:\Data\books_new.xml", settings))
doc.Save(writer);
XPath 查詢含命名空間 XML 時,必須使用 XmlNamespaceManager 註冊前綴,否則 SelectSingleNode 永遠回傳 null。
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", "https://target.namespace.uri");
XmlNode node = doc.SelectSingleNode("//ns:ElementName", nsmgr);
| 事件 | 觸發時機 |
|---|---|
| NodeInserting / NodeInserted | 節點即將/已插入 |
| NodeRemoving / NodeRemoved | 節點即將/已移除 |
| NodeChanging / NodeChanged | 節點 Value 即將/已變更 |
doc.NodeInserted += (s, e) => Console.WriteLine($"新增節點: {e.Node.Name}");
| 場景 | 建議類別 | 理由 |
|---|---|---|
| 中小型 XML、需隨機存取、修改 | XmlDocument | DOM 模型直觀、API 豐富 |
| 大型 XML (>50MB)、唯讀、順序讀取 | XmlReader | 流式、低記憶體、高速度 |
| LINQ 風格查詢、函數式構建 | XDocument (System.Xml.Linq) | 現代 API、語法優雅、效能相近 |
| 超大 XML 需修改 | XStreamingElement + XmlReader | 串流修改、恆定記憶體 |
XmlDocument 是 .NET 經典 XML 處理利器,掌握 載入 → XPath 查詢 → 節點操作 → 儲存/驗證 核心流程,善用 XmlNamespaceManager 處理命名空間,配合 XmlDocumentFragment 批量掛載提升效能。新專案優先考慮 XDocument,舊專案維護 XmlDocument 仍是穩健選擇。