.NET 早期 (1.x/2.0) 提供 XmlDataDocument、DocumentNavigator 等類別,實現 XML 與 DataSet 雙向同步、XPath 導航、WebForm DataGrid 繫結。雖現代專案多改用 LINQ to XML,但維護舊系統仍需理解此架構。本文整理核心類別用法、顯示/新增/刪除 XML 資料完整流程。
XmlDataDocument:繼承 XmlDocument,內含 DataSet 屬性,XML 節點與 DataTable 資料列**雙向同步**。DataSet.ReadXml:將 XML 載入 DataSet (結構推論或讀取 Schema)。DocumentNavigator:游標式導航,支援 `MoveTo*`、`Insert`、`RemoveSelected`、`Select(XPath)`。XPath:`Select("/Guests/Guest[Name='...']")` 定位節點。protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string file = Server.MapPath("guest.xml");
using (var sr = new StreamReader(file))
{
var xdd = new XmlDataDocument();
xdd.DataSet.ReadXml(sr); // XML -> DataSet
DataGrid1.DataSource = xdd.DataSet.Tables[0].DefaultView;
DataGrid1.DataBind();
}
}
}
protected void btnAdd_Click(object sender, EventArgs e)
{
string file = Server.MapPath("guest.xml");
var xdd = new XmlDataDocument();
xdd.Load(file);
var nav = new DocumentNavigator(xdd);
nav.MoveToDocumentElement(); //
// 插入
nav.Insert(TreePosition.FirstChild, XmlNodeType.Element, "Guest", "", "");
// 插入 及文字節點
nav.Insert(TreePosition.FirstChild, XmlNodeType.Element, "Name", "", "");
nav.Insert(TreePosition.FirstChild, XmlNodeType.Text, "", "", txtName.Text);
nav.MoveToParent(); // 回到
// 同理插入 , , ...
nav.Insert(TreePosition.FirstChild, XmlNodeType.Element, "Country", "", "");
nav.Insert(TreePosition.FirstChild, XmlNodeType.Text, "", "", txtCountry.Text);
nav.MoveToParent();
// ...
xdd.Save(file); // 同步回 XML 檔案
}
protected void btnDelete_Click(object sender, EventArgs e)
{
string file = Server.MapPath("guest.xml");
var xdd = new XmlDataDocument();
xdd.Load(file);
var nav = new DocumentNavigator(xdd);
nav.MoveToDocumentElement();
// XPath 選取特定 Name 的 Guest 節點
string xpath = $"/Guests/Guest[Name='{Session["select_name"]}']";
nav.Select(xpath);
nav.RemoveSelected(); // 刪除選取節點及其子樹
xdd.Save(file);
}
nav.MoveToDocumentElement();
nav.RemoveChildren(); // 移除根節點下所有子節點
| 問題 | 說明 |
|---|---|
| XmlDataDocument 同步效能 | 大量資料 ( > 1 萬列) 雙向同步極慢,建議改用 `DataSet.ReadXml` 單向讀取或 LINQ to XML。 |
| DocumentNavigator 狀態 | 游標操作需嚴格配對 `MoveToParent`/`MoveToFirstChild`,否則易插入錯誤層級。 |
| XPath 注入 | 拼接 XPath 字串時需轉義單引號,或改用參數化查詢 (System.Xml.XPath.XPathExpression)。 |
| 編碼 | XML 檔案儲存為 UTF-8,`StreamReader` 需指定 `Encoding.UTF8`,避免中文亂碼。 |
| 舊 API | 現代替代 (.NET 3.5+) | 優勢 |
|---|---|---|
XmlDataDocument | XDocument + DataSet 獨立操作 | 解耦 XML 與關係資料模型 |
DocumentNavigator | XElement 建構 / `Descendants` 查詢 | 函數式、強型別、LINQ 整合 |
DataGrid (WebForm) | GridView / ASP.NET Core / Blazor / Web API + 前端框架 | 關注點分離、可測試、跨平台 |
XmlDataDocument + DocumentNavigator 是 .NET 1.x 時代「XML 即資料庫」的產物,適合小型、結構簡單、需雙向同步的場景。新專案請採用 LINQ to XML (XDocument) 處理 XML,Entity Framework / Dapper 處理關係資料,兩者在應用層組合,避免混用導致的複雜度與效能問題。