C# XmlDocument 常用操作:XML 文件的创建、增删改查完整类
本文分享一个基于C# System.Xml命名空间的XmlHelper辅助类。该类封装了使用XmlDocument进行XML文档管理的常用方法,包括创建XML文件、插入节点及子元素、更新指定XPath节点的属性与文本值、删除整个节点或特定属性,以及查询单个或列表节点数据。
准备工作
在使用以下代码之前,请确保项目已引入必要的命名空间。
- 打开 Visual Studio 或其他 C# 开发环境。
- 在代码顶部添加对
System.Xml的引用,这是处理 XML 的基础库。
using System;
using System.Collections; // 用于 Hashtable
using System.Xml;
第1步:初始化 XmlHelper 类结构
该类的核心在于维护一个全局的 XmlDocument 实例以简化调用。以下是基础的类定义与公共成员变量声明。
namespace Jb51.Com.XmlDAL
{
public class XmlHelper
{
#region 公共变量
XmlDocument xmldoc;
XmlNode xmlnode;
XmlElement xmlelem;
#endregion
}
第2步:创建带有根节点的 XML 文档
该方法用于新建一个 XML 文件并写入初始声明和根节点。支持自定义编码格式(如 UTF-8)。
- 参数:
FileName: 目标文件路径
RootName: 根节点名称
Encode: 编码方式(例如 "utf-8" 或 "gb2312") - 返回值: 成功返回
true,异常捕获时返回false。
public bool CreateXmlDocument(string FileName, string RootName, string Encode)
{
try
{
xmldoc = new XmlDocument();
XmlDeclaration xmldecl;
xmldecl = xmldoc.CreateXmlDeclaration("1.0", Encode, null);
xmldoc.AppendChild(xmldecl);
xmlelem = xmldoc.CreateElement("", RootName, "");
xmldoc.AppendChild(xmlelem);
xmldoc.Save(FileName);
return true;
}
catch (Exception e)
{
// 实际应用中建议记录日志而非简单 throw
return false;
}
}
创建示例
在 D 盘创建一个名为 keleyimenu.xml 的文档,根节点为 keleyimenu。
XmlHelper m_menu_keleyi_com = new XmlHelper();
m_menu_keleyi_com.CreateXmlDocument(@"D:\kel" + "eyimenu.xml", "ke" + "leyimenu", "utf-8");
生成的初始内容如下:
<?xml version="1.0" encoding="utf-8"?>
<keleyimenu />
第3步:插入新节点及其属性/子节点
通过 XPath 定位父节点,并在其后追加新的 XmlElement。支持为节点设置属性字典和子节点文本字典。
- 参数说明:
faterNode: 要追加的子节点的父节点的 XPath。
HasAttributes: 布尔值,指示是否包含属性。
htAtt:Hashtable,Key 为属性名,Value 为属性值。
htSubNode:Hashtable,Key 为子节点名称,Value 为内部文本 (InnerText)。
public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes,
string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmldoc = new XmlDocument();
xmldoc.Load(XmlFile);
XmlNode root = xmldoc.SelectSingleNode(fatherNode);
xmlelem = xmldoc.CreateElement(NewNodeName);
if (htAtt != null && HasAttributes)
{
SetAttributes(xmlelem, htAtt);
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);
}
else
{
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);
}
root.AppendChild(xmlelem); // 注意:此处逻辑是将新元素添加到查找到的 root 下
xmldoc.Save(XmlFile);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
第4步:更新节点的属性与子节点文本
遍历指定的父节点下的所有子节点列表,匹配哈希表中的 Key,更新对应的属性值或文本内容。
public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmldoc = new XmlDocument();
xmldoc.Load(XmlFile);
XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes;
UpdateNodes(root, htAtt, htSubNode); // 内部私有方法执行具体更新
xmldoc.Save(XmlFile);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
更新实现的私有逻辑
// 设置节点属性
private void SetAttributes(XmlElement xe, Hashtable htAttribute)
{
foreach (DictionaryEntry de in htAttribute)
{
xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
}
}
// 更新节点属性和子节点InnerText值
private void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
{
foreach (XmlNode xn in root)
{
xmlelem = (XmlElement)xn;
// 更新属性
if (xmlelem.HasAttributes)
{
foreach (DictionaryEntry de in htAtt)
{
if (xmlelem.HasAttribute(de.Key.ToString()))
{
xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());
}
}
}
// 更新子节点内容
if (xmlelem.HasChildNodes)
{
XmlNodeList xnl = xmlelem.ChildNodes;
foreach (XmlNode xn1 in xnl)
{
XmlElement xe = (XmlElement)x
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









