針對中小型項目中 XML 作為輕量級存儲的場景,封裝一個輕量級、無依賴、易擴展的 XML 操作類 CXML,支持 XPath 查詢、節點增刪改、數據綁定、文件持久化等核心功能。
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; // 釋放引用
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Users>
<User ID="1">
<Name>張三</Name>
<Age>28</Age>
</User>
</Users>
// 初始化
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();
XPathNavigator.CompileValidate(XmlSchemaSet) 方法確保數據完整性XmlNamespaceManager 處理複雜 XMLSaveAsync() 避免 UI 阻塞BeginTrans/Commit/Rollback)XDocument 獲得更優雅的語法| 適用場景 | 不適用場景 |
|---|---|
| 配置文件管理 | 大數據量(>10MB) |
| 靜態數據緩存 | 高併發寫入 |
| 跨平台數據交換 | 複雜關聯查詢 |
| 桌面應用本地存儲 | 需 ACID 事務保證 |
此組件代碼量小、零依賴、易理解,適合快速集成到 WinForms/WebForms/控制台項目中。隨著項目增長,建議漸進式遷移至 SQLite 或輕量級 NoSQL(如 LiteDB)獲得更好性能與功能支持。