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

C# XML 程式設計詳解 (二) - 新增、刪除與最佳實務

     編輯:關於C語言

承上篇 XML 建立與讀取,本文聚焦 `XmlDocument` + `XmlNode`/`XmlElement` 操作新增/刪除節點,並討論效能、編碼、大檔案策略。

新增節點:三種常用模式

1. XmlDocument + CreateElement (標準 DOM)


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);

2. XPath + SelectSingleNode 定位插入點


var insertPoint = doc.SelectSingleNode("/Guests/Guest[1]");
root.InsertBefore(guest, insertPoint);

3. LINQ to XML (現代、推薦)


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);

刪除節點

DOM 方式


var node = doc.SelectSingleNode($"/Guests/Guest[Name='{selectedName}']");
node?.ParentNode?.RemoveChild(node);
doc.Save(path);

LINQ to XML


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 不適合超大資料

最佳實務清單

  1. 指定編碼:`doc.Save(path)` 預設 UTF-8,跨平台最安全;若需 BOM 用 `new XmlTextWriter(path, Encoding.UTF8) { Formatting = Formatting.Indented }`。
  2. 釋放資源:`XmlDocument` 無 `IDisposable`,但大檔案處理完設 `null` 利 GC;`XmlReader/Writer` 必須 `using` 或 `Close()`。
  3. 驗證結構:生產環境搭配 XSD Schema (`XmlReaderSettings.Schemas.Add`),防止惡意/錯誤 XML 導致例外或邏輯錯誤。
  4. 防止 XML 外部實體 (XXE) 攻擊:`XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit; XmlResolver = null;`。
  5. 序列化替代:單純物件圖儲存優先考慮 `System.Text.Json` / `XmlSerializer`,手寫 XML 僅用於高度客製化結構。

結語

C# 操作 XML 已從 `XmlDocument` 進化至 `LINQ to XML` (XDocument) 為主流,語法更簡潔、型別安全、支援 LINQ 查詢。大檔案場景仍需 `XmlReader/Writer` 流式處理。選對工具,事半功倍。

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