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

C# XML 操作工具類:封裝增刪改查與數據綁定的可擴展組件

     編輯:關於C語言

組件設計目標

針對中小型項目中 XML 作為輕量級存儲的場景,封裝一個輕量級、無依賴、易擴展的 XML 操作類 CXML,支持 XPath 查詢、節點增刪改、數據綁定、文件持久化等核心功能。

一、完整類代碼 (CXML.cs)

using System;
using System.Data;
using System.Xml;
using System.IO;

public class CXML
{
    private string _xmlFilePath;
    private XmlDocument _xmlDoc = new XmlDocument();

    /// 
    /// 構造函數:加載指定 XML 文件
    /// 
    public CXML(string xmlFile)
    {
        _xmlFilePath = xmlFile;
        try
        {
            _xmlDoc.Load(_xmlFilePath);
        }
        catch (Exception ex)
        {
            // 文件不存在或格式錯誤時創建空文檔
            _xmlDoc.LoadXml("");
            // 可選:記錄日誌 ex.Message
        }
    }

    /// 
    /// 根據 XPath 查詢返回 DataView(適配 DataGrid 等控件)
    /// 
    public DataView GetData(string xPathNode)
    {
        DataSet ds = new DataSet();
        XmlNode node = _xmlDoc.SelectSingleNode(xPathNode);
        if (node == null) return new DataView();

        using (StringReader reader = new StringReader(node.OuterXml))
        {
            ds.ReadXml(reader);
        }
        return ds.Tables.Count > 0 ? ds.Tables[0].DefaultView : new DataView();
    }

    /// 
    /// 更新節點文本內容
    /// 
    public void Replace(string xPathNode, string content)
    {
        XmlNode node = _xmlDoc.SelectSingleNode(xPathNode);
        if (node != null) node.InnerText = content;
    }

    /// 
    /// 刪除指定節點
    /// 
    public void Delete(string nodePath)
    {
        XmlNode target = _xmlDoc.SelectSingleNode(nodePath);
        if (target?.ParentNode != null)
        {
            target.ParentNode.RemoveChild(target);
        }
    }

    /// 
    /// 插入父子節點結構
    /// 
    public void InsertNode(string parentPath, string childName, string elementName, string content)
    {
        XmlNode parent = _xmlDoc.SelectSingleNode(parentPath);
        if (parent == null) return;

        XmlElement child = _xmlDoc.CreateElement(childName);
        XmlElement element = _xmlDoc.CreateElement(elementName);
        element.InnerText = content;
        
        child.AppendChild(element);
        parent.AppendChild(child);
    }

    /// 
    /// 插入帶屬性的元素節點
    /// 
    public void InsertElement(string parentPath, string elementName, 
        string attrName, string attrValue, string content)
    {
        XmlNode parent = _xmlDoc.SelectSingleNode(parentPath);
        if (parent == null) return;

        XmlElement element = _xmlDoc.CreateElement(elementName);
        element.SetAttribute(attrName, attrValue);
        element.InnerText = content;
        parent.AppendChild(element);
    }

    /// 
    /// 插入無屬性元素節點(重載)
    /// 
    public void InsertElement(string parentPath, string elementName, string content)
    {
        XmlNode parent = _xmlDoc.SelectSingleNode(parentPath);
        if (parent == null) return;

        XmlElement element = _xmlDoc.CreateElement(elementName);
        element.InnerText = content;
        parent.AppendChild(element);
    }

    /// 
    /// 保存變更到文件
    /// 
    public void Save()
    {
        try
        {
            _xmlDoc.Save(_xmlFilePath);
        }
        catch (Exception ex)
        {
            // 記錄日誌 ex.Message
            throw new IOException("XML 保存失敗", ex);
        }
        finally
        {
            _xmlDoc = null; // 釋放引用
        }
    }
}

二、使用示例

2.1 基礎數據文件 (data.xml)

<?xml version="1.0" encoding="utf-8"?>
<Users>
  <User ID="1">
    <Name>張三</Name>
    <Age>28</Age>
  </User>
</Users>

2.2 業務代碼調用

// 初始化
CXML xmlHelper = new CXML(Server.MapPath("~/App_Data/data.xml"));

// 1. 綁定數據到 GridView
GridView1.DataSource = xmlHelper.GetData("/Users/User");
GridView1.DataBind();

// 2. 修改節點內容
xmlHelper.Replace("/Users/User[1]/Name", "李四");

// 3. 新增用戶(帶屬性)
xmlHelper.InsertElement("/Users", "User", "ID", "2", "");
xmlHelper.InsertElement("/Users/User[@ID='2']", "Name", "王五");
xmlHelper.InsertElement("/Users/User[@ID='2']", "Age", "32");

// 4. 刪除用戶
xmlHelper.Delete("/Users/User[@ID='1']");

// 5. 持久化
xmlHelper.Save();

三、擴展建議

  1. XPath 編譯緩存:頻繁查詢同一路徑時使用 XPathNavigator.Compile
  2. Schema 驗證:添加 Validate(XmlSchemaSet) 方法確保數據完整性
  3. 命名空間支持:引入 XmlNamespaceManager 處理複雜 XML
  4. 異步保存:實現 SaveAsync() 避免 UI 阻塞
  5. 事務機制:實現快照回滾(BeginTrans/Commit/Rollback)
  6. LINQ to XML 遷移:.NET 3.5+ 建議遷移至 XDocument 獲得更優雅的語法

四、適用場景與局限

適用場景不適用場景
配置文件管理大數據量(>10MB)
靜態數據緩存高併發寫入
跨平台數據交換複雜關聯查詢
桌面應用本地存儲需 ACID 事務保證

此組件代碼量小、零依賴、易理解,適合快速集成到 WinForms/WebForms/控制台項目中。隨著項目增長,建議漸進式遷移至 SQLite 或輕量級 NoSQL(如 LiteDB)獲得更好性能與功能支持。

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