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

C# XML 程式設計詳解:XmlDataDocument、DocumentNavigator、XPath 與 DataGrid 繫結

     編輯:關於C#

.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='...']")` 定位節點。

1. 顯示 XML 內容於 DataGrid (WebForm)

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

2. 新增記錄 (DocumentNavigator.Insert)

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 檔案
}

3. 刪除記錄 (XPath 定位 + RemoveSelected)

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

4. 清空所有記錄

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+)優勢
XmlDataDocumentXDocument + DataSet 獨立操作解耦 XML 與關係資料模型
DocumentNavigatorXElement 建構 / `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 處理關係資料,兩者在應用層組合,避免混用導致的複雜度與效能問題。

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