承上篇 XML 建立與讀取,本文聚焦 `XmlDocument` + `XmlNode`/`XmlElement` 操作新增/刪除節點,並討論效能、編碼、大檔案策略。
var doc = new XmlDocument();
doc.Load(path);
var root = doc.DocumentElement;
var guest = doc.CreateElement("Guest");
var name = doc.CreateElement("Name");
name.InnerText = txtName.Text;
guest.AppendChild(name);
// ... Country, Email, Message 同理
root.InsertBefore(guest, root.FirstChild); // 插入至最前
doc.Save(path);
var insertPoint = doc.SelectSingleNode("/Guests/Guest[1]");
root.InsertBefore(guest, insertPoint);
var xdoc = XDocument.Load(path);
xdoc.Root.Elements("Guest").First().AddBeforeSelf(
new XElement("Guest",
new XElement("Name", txtName.Text),
new XElement("Country", txtCountry.Text),
new XElement("Email", txtEmail.Text),
new XElement("Message", txtMsg.Text)
)
);
xdoc.Save(path);
var node = doc.SelectSingleNode($"/Guests/Guest[Name='{selectedName}']");
node?.ParentNode?.RemoveChild(node);
doc.Save(path);
xdoc.Root.Elements("Guest")
.Where(g => g.Element("Name")?.Value == selectedName)
.Remove();
xdoc.Save(path);
// DOM
root.RemoveAll();
// LINQ
xdoc.Root.Elements().Remove();
| 檔案大小 | 推薦方式 | 理由 |
|---|---|---|
| < 10 MB | `XmlDocument` / `XDocument` | 記憶體可負擔,API 豐富 |
| 10 MB ~ 500 MB | `XmlReader` + `XmlWriter` (流式) | 不載入完整樹,恆定記憶體 |
| > 500 MB | 分割檔案 / 資料庫 / 專用 XML 資料庫 (BaseX, eXist-db) | 單檔 XML 不適合超大資料 |
C# 操作 XML 已從 `XmlDocument` 進化至 `LINQ to XML` (XDocument) 為主流,語法更簡潔、型別安全、支援 LINQ 查詢。大檔案場景仍需 `XmlReader/Writer` 流式處理。選對工具,事半功倍。