C# XmlDocument 常用操作:XML 文件的创建、增删改查完整类

Finn
Finn
发布时间:2026-10-14 | 4人浏览过
原创

本文分享一个基于C# System.Xml命名空间的XmlHelper辅助类。该类封装了使用XmlDocument进行XML文档管理的常用方法,包括创建XML文件、插入节点及子元素、更新指定XPath节点的属性与文本值、删除整个节点或特定属性,以及查询单个或列表节点数据。

准备工作

在使用以下代码之前,请确保项目已引入必要的命名空间。

  1. 打开 Visual Studio 或其他 C# 开发环境。
  2. 在代码顶部添加对 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
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表