首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET XmlDocument 類別完整指南:屬性、方法、事件與實戰代碼詳解

     編輯:ASP.NET 基礎

XmlDocument 核心定位

.NET Framework 的 DOM 解析器,將 XML 載入記憶體構建樹狀結構,支援完整的導航、查詢、修改、驗證功能。適合中小型 XML 文件 (建議 < 10MB),大文件請改用 XmlReader/XStreamingElement 流式處理。

核心屬性速查表

屬性用途備註
DocumentElement取得根元素最常用入口點
ChildNodes / FirstChild / LastChild子節點集合/首尾節點繼承自 XmlNode
InnerText / InnerXml / OuterXml文字內容 / 內部 XML / 含自身 XMLInnerText 會串聯所有子孫文字
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);

命名空間處理關鍵:XmlNamespaceManager

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、需隨機存取、修改XmlDocumentDOM 模型直觀、API 豐富
大型 XML (>50MB)、唯讀、順序讀取XmlReader流式、低記憶體、高速度
LINQ 風格查詢、函數式構建XDocument (System.Xml.Linq)現代 API、語法優雅、效能相近
超大 XML 需修改XStreamingElement + XmlReader串流修改、恆定記憶體

總結

XmlDocument 是 .NET 經典 XML 處理利器,掌握 載入 → XPath 查詢 → 節點操作 → 儲存/驗證 核心流程,善用 XmlNamespaceManager 處理命名空間,配合 XmlDocumentFragment 批量掛載提升效能。新專案優先考慮 XDocument,舊專案維護 XmlDocument 仍是穩健選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved