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

C# Web XML 程式設計實戰:讀寫、資料綁定與 XPath 查詢

     編輯:關於C語言

XML 在 .NET 生態系的定位

XML 以其跨平台、自描述、人機可讀特性,成為企業應用整合 (EAI)、設定檔、資料交換的標準格式。.NET Framework 圍繞 XML 核心提供豐富類別庫:

  • 串流模型:XmlReader (唯讀、前向)、XmlWriter (唯寫、前向) — 記憶體效率最高。
  • DOM 模型:XmlDocument、XmlNode、XmlElement — 記憶體樹狀結構,支援隨機存取與修改。
  • 導航模型:XPathNavigator — 唯讀、游標式導航,支援 XPath 查詢。
  • 轉換模型:XslCompiledTransform — XSLT 樣式表轉換。

案例專案:留言板系統 (ASP.NET Web Forms)

假設 XML 資料檔 guest.xml 結構如下:

<Guests>
  <Guest>
    <Name>張三</Name>
    <Country>台灣</Country>
    <Email>zhang@example.com</Email>
    <Message>歡迎光臨!</Message>
  </Guest>
</Guests>

功能一:顯示資料 — DataGrid 綁定 XmlDataDocument

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; // 釋放參考
}

DataGrid 標記 (含選取按鈕)

<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"); // 轉至管理頁
}

功能二:新增資料 — XPathNavigator 節點操作

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

功能三:刪除資料 — XPath 精準定位

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 / XPathNavigatorDOM 模型支援隨機修改,開發效率高
資料量極大、高併發查詢XML 資料庫 / SQL Server XML 欄位檔案系統 I/O 瓶頸,需索引與快取支援
跨系統資料交換XSD Schema + XSLT契約優先,確保雙方格式一致

最佳實踐總結

  1. 釋放資源:XmlDocument、StreamReader 用畢即棄,避免檔案鎖定。
  2. 輸入驗證:防止 XML 注入,寫入前對使用者輸入進行 XmlConvert.EncodeName 或 CDATA 區塊包裹。
  3. 編碼一致:XML 宣告 <?xml encoding="utf-8"?>,檔案儲存、讀取、網頁回應皆統一 UTF-8。
  4. 快取策略:頻繁讀取、極少寫入的場景,將 DataSet 或 XmlDocument 快取於 Application/Redis,檔案變更時失效重載。

結語

C# 操作 XML 的 API 設計極為成熟,XmlDataDocument 與 DataSet 整合讓 Web Forms 資料綁定極簡單;XPathNavigator 提供強大的查詢與修改能力。選對模型 (串流/DOM/導航) 是效能與維護性的關鍵。現代專案建議優先考慮 System.Xml.Linq (LINQ to XML),語法更直觀、功能更強大,將於後續文章介紹。

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