XML 具跨平台、易共享特性,常用於企業報表、新聞發布、小型資料儲存。.NET 提供豐富類別操作 XML:XmlReader/Writer(串流)、XmlDocument/XmlNode/XmlElement(DOM)、XPathNavigator(XPath)、XslTransform(XSLT)。本文以 ASP.NET WebForms 示範 DOM 方式完整 CRUD 流程。
<?xml version="1.0" encoding="utf-8"?>
<Guests>
<Guest>
<Name>王小明</Name>
<Country>Taiwan</Country>
<Email>wang@example.com</Email>
<Message>歡迎光臨</Message>
</Guest>
</Guests>
// 頁面載入
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) BindGrid();
}
private void BindGrid()
{
string path = Server.MapPath("~/App_Data/guests.xml");
var doc = new XmlDataDocument();
using (var sr = new StreamReader(path, Encoding.UTF8))
doc.DataSet.ReadXml(sr); // DataSet 直接讀 XML
DataGrid1.DataSource = doc.DataSet.Tables[0].DefaultView;
DataGrid1.DataBind();
}
// DataGrid 選取事件 → 存入 Session 導向管理頁
protected void OnSelectName(object sender, EventArgs e)
{
string name = DataGrid1.SelectedItem.Cells[1].Text;
Session["SelectedName"] = name;
Response.Redirect("XmlManage.aspx");
}
protected void btnSave_Click(object sender, EventArgs e)
{
string path = Server.MapPath("~/App_Data/guests.xml");
var doc = new XmlDocument();
doc.Load(path);
// 使用 XPathNavigator 插入節點
var nav = doc.CreateNavigator();
nav.MoveToRoot(); // 移至 <Guests>
nav.MoveToFirstChild(); // 移至第一個 <Guest>(或為空則在根下新增)
// 在根元素下插入新 <Guest> 作為第一個子節點
nav.InsertElementAfter("", "Guest", "", ""); // 需自行定位位置
// 簡化:直接用 DOM API
XmlElement guest = doc.CreateElement("Guest");
guest.AppendChild(CreateElement(doc, "Name", txtName.Text));
guest.AppendChild(CreateElement(doc, "Country", txtCountry.Text));
guest.AppendChild(CreateElement(doc, "Email", txtEmail.Text));
guest.AppendChild(CreateElement(doc, "Message", txtMessage.Text));
doc.DocumentElement.PrependChild(guest); // 插在最前
doc.Save(path);
Response.Redirect("Default.aspx");
}
private XmlElement CreateElement(XmlDocument doc, string name, string value)
{
var el = doc.CreateElement(name);
el.InnerText = value;
return el;
}
protected void btnDelete_Click(object sender, EventArgs e)
{
string path = Server.MapPath("~/App_Data/guests.xml");
string name = Session["SelectedName"]?.ToString();
if (string.IsNullOrEmpty(name)) return;
var doc = new XmlDocument();
doc.Load(path);
// XPath 定位:/Guests/Guest[Name='王小明']
string xpath = $"/Guests/Guest[Name='{name}']";
XmlNode node = doc.SelectSingleNode(xpath);
node?.ParentNode?.RemoveChild(node);
doc.Save(path);
Response.Redirect("Default.aspx");
}
| 場景 | 建議技術 | 理由 |
|---|---|---|
| 資料量小(< 1MB)、讀多寫少 | XML 檔案 + DOM (XmlDocument) | 開發簡單、無需資料庫、易部署 |
| 資料量中、頻繁查詢/更新 | SQL Server + FOR XML / OPENXML | 索引、交易、並行控制、效能佳 |
| 跨系統整合、異構資料 | XML + XSLT / XPath | 標準化交換格式、轉換彈性 |
| .NET Core / 5+ 現代專案 | System.Xml.Linq (XDocument) | LINQ to XML 語法優雅、功能強大 |
// 新增
var doc = XDocument.Load(path);
doc.Root.AddFirst(
new XElement("Guest",
new XElement("Name", txtName.Text),
new XElement("Country", txtCountry.Text),
new XElement("Email", txtEmail.Text),
new XElement("Message", txtMessage.Text)
));
doc.Save(path);
// 刪除
doc.Root.Elements("Guest")
.Where(g => g.Element("Name").Value == name)
.Remove();
doc.Save(path);
XML 適合「資料量小、結構簡單、需跨平台共享」的情境。ASP.NET 內建 XmlDataDocument 與 DataSet 整合 DataGrid 極為方便;現代專案請優先使用 XDocument (LINQ to XML) 享受強型別與查詢表達能力。