XML 以其跨平台、自描述、人機可讀特性,成為企業應用整合 (EAI)、設定檔、資料交換的標準格式。.NET Framework 圍繞 XML 核心提供豐富類別庫:
XmlReader (唯讀、前向)、XmlWriter (唯寫、前向) — 記憶體效率最高。XmlDocument、XmlNode、XmlElement — 記憶體樹狀結構,支援隨機存取與修改。XPathNavigator — 唯讀、游標式導航,支援 XPath 查詢。XslCompiledTransform — XSLT 樣式表轉換。假設 XML 資料檔 guest.xml 結構如下:
<Guests>
<Guest>
<Name>張三</Name>
<Country>台灣</Country>
<Email>zhang@example.com</Email>
<Message>歡迎光臨!</Message>
</Guest>
</Guests>
using System.Xml;
using System.IO;
using System.Data;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) BindGrid();
}
private void BindGrid()
{
string filePath = Server.MapPath("guest.xml");
// 使用 XmlDataDocument 彎橋 XML 與 DataSet
XmlDataDocument doc = new XmlDataDocument();
using (StreamReader sr = new StreamReader(filePath))
{
doc.DataSet.ReadXml(sr); // 將 XML 載入 DataSet
}
// 綁定第一個 Table 的 DefaultView
DataGrid1.DataSource = doc.DataSet.Tables[0].DefaultView;
DataGrid1.DataBind();
doc = null; // 釋放參考
}
<asp:DataGrid id="DataGrid1" runat="server"
AutoGenerateColumns="False"
OnSelectedIndexChanged="OnSelectName">
<Columns>
<asp:ButtonColumn Text="選擇" CommandName="Select" />
<asp:BoundColumn DataField="Name" HeaderText="姓名" />
<asp:BoundColumn DataField="Country" HeaderText="國家" />
<asp:BoundColumn DataField="Email" HeaderText="信箱" />
<asp:BoundColumn DataField="Message" HeaderText="留言" />
</Columns>
</asp:DataGrid>
protected void OnSelectName(object sender, EventArgs e)
{
// 取得被選取列的 Name 欄位值
string selectedName = DataGrid1.SelectedItem.Cells[1].Text;
Session["select_name"] = selectedName;
Response.Redirect("XML_manage.aspx"); // 轉至管理頁
}
protected void btnAdd_Click(object sender, EventArgs e)
{
string filePath = Server.MapPath("guest.xml");
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToRoot(); // 移至文件根節點
nav.MoveToFirstChild(); // 移至
// 插入 子節點
nav.AppendChildElement("", "Guest", "", "");
nav.MoveToChild("Guest", ""); // 移至新建的
// 依序插入子元素
AppendElement(nav, "Name", txtName.Text);
AppendElement(nav, "Country", txtCountry.Text);
AppendElement(nav, "Email", txtEmail.Text);
AppendElement(nav, "Message", txtMessage.Text);
doc.Save(filePath);
BindGrid(); // 重新整理畫面
}
private void AppendElement(XPathNavigator nav, string localName, string value)
{
nav.AppendChildElement("", localName, "", value);
}
protected void btnDelete_Click(object sender, EventArgs e)
{
string filePath = Server.MapPath("guest.xml");
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToRoot();
// 使用 XPath 定位特定 Name 的 Guest 節點
string xpath = $"/Guests/Guest[Name='{Session["select_name"]}']";
XPathNavigator target = nav.SelectSingleNode(xpath);
if (target != null)
{
target.DeleteSelf(); // 刪除整個 節點
doc.Save(filePath);
BindGrid();
}
}
// 刪除所有 子節點
nav.MoveToRoot();
nav.MoveToFirstChild(); //
nav.DeleteChildren(); // 移除所有子節點
doc.Save(filePath);
| 場景 | 建議技術 | 理由 |
|---|---|---|
| 大量資料唯讀顯示 | XmlReader + 繼續器 | 串流式讀取,記憶體佔用極低 |
| 頻繁增刪改、資料量中等 | XmlDocument / XPathNavigator | DOM 模型支援隨機修改,開發效率高 |
| 資料量極大、高併發查詢 | XML 資料庫 / SQL Server XML 欄位 | 檔案系統 I/O 瓶頸,需索引與快取支援 |
| 跨系統資料交換 | XSD Schema + XSLT | 契約優先,確保雙方格式一致 |
XmlDocument、StreamReader 用畢即棄,避免檔案鎖定。XmlConvert.EncodeName 或 CDATA 區塊包裹。<?xml encoding="utf-8"?>,檔案儲存、讀取、網頁回應皆統一 UTF-8。DataSet 或 XmlDocument 快取於 Application/Redis,檔案變更時失效重載。C# 操作 XML 的 API 設計極為成熟,XmlDataDocument 與 DataSet 整合讓 Web Forms 資料綁定極簡單;XPathNavigator 提供強大的查詢與修改能力。選對模型 (串流/DOM/導航) 是效能與維護性的關鍵。現代專案建議優先考慮 System.Xml.Linq (LINQ to XML),語法更直觀、功能更強大,將於後續文章介紹。