在C#开发中,XML文件常被用作配置文件或数据交换格式,当业务需求变化时,往往需要动态修改XML中的节点内容,比如更新配置参数、调整数据记录等。掌握C#修改XML节点的方法,能有效提升开发效率。

C#修改XML节点的两种常用方式
C#中操作XML主要有两个主流方案,分别是XmlDocument类和System.Xml.Linq命名空间下的Linq to XML相关类,两种方式各有适用场景,下面分别介绍。
方式一:使用XmlDocument修改XML节点
XmlDocument是传统的XML操作类,适合需要兼容旧版本.NET框架的场景,操作逻辑是先加载XML文件,再定位目标节点,最后修改内容并保存。
示例XML文件内容
假设我们要修改的XML文件路径为config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="serverIp" value="127.0.0.1"/>
<add key="port" value="8080"/>
<add key="maxConnection" value="100"/>
</appSettings>
<userInfo>
<name>张三</name>
<age>25</age>
</userInfo>
</configuration>
修改节点属性和文本内容的代码
下面的代码演示了如何修改serverIp的属性值,以及userInfo下的name节点文本内容:
using System;
using System.Xml;
namespace XmlUpdateDemo
{
class Program
{
static void Main(string[] args)
{
// XML文件路径
string xmlPath = "config.xml";
// 创建XmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// 加载XML文件
xmlDoc.Load(xmlPath);
// 1. 修改appSettings下key为serverIp的节点的value属性
// 获取所有add节点
XmlNodeList addNodes = xmlDoc.SelectNodes("/configuration/appSettings/add");
if (addNodes != null)
{
foreach (XmlNode node in addNodes)
{
// 判断节点的key属性是否为serverIp
if (node.Attributes["key"]?.Value == "serverIp")
{
// 修改value属性值
node.Attributes["value"].Value = "192.168.0.1";
break;
}
}
}
// 2. 修改userInfo下name节点的文本内容
XmlNode nameNode = xmlDoc.SelectSingleNode("/configuration/userInfo/name");
if (nameNode != null)
{
nameNode.InnerText = "李四";
}
// 保存修改后的XML文件
xmlDoc.Save(xmlPath);
Console.WriteLine("XML修改完成");
}
}
}
方式二:使用Linq to XML修改XML节点
Linq to XML是.NET 3.5之后引入的更简洁的XML操作方式,代码可读性更强,操作更灵活,适合新开发的.NET项目使用。
同样的修改需求实现代码
使用XDocument类实现上述同样的修改操作,代码如下:
using System;
using System.Linq;
using System.Xml.Linq;
namespace XmlUpdateDemo
{
class Program
{
static void Main(string[] args)
{
string xmlPath = "config.xml";
// 加载XML文件到XDocument
XDocument xDoc = XDocument.Load(xmlPath);
// 1. 修改serverIp的value属性
// 查询key为serverIp的add元素
XElement serverIpElement = xDoc.Descendants("add")
.FirstOrDefault(e => e.Attribute("key")?.Value == "serverIp");
if (serverIpElement != null)
{
// 修改value属性
serverIpElement.SetAttributeValue("value", "192.168.0.1");
}
// 2. 修改name节点的文本内容
XElement nameElement = xDoc.Descendants("name").FirstOrDefault();
if (nameElement != null)
{
nameElement.Value = "李四";
}
// 保存修改
xDoc.Save(xmlPath);
Console.WriteLine("XML修改完成");
}
}
}
两种方式的对比与选择
两种方式的核心差异如下,开发者可以根据项目需求选择:
| 对比项 | XmlDocument | Linq to XML |
|---|---|---|
| 适用框架 | .NET Framework 1.1及以上 | .NET Framework 3.5及以上、.NET Core、.NET 5+ |
| 代码简洁度 | 较低,需要较多节点遍历代码 | 较高,支持Linq查询,代码更简洁 |
| 内存占用 | 较高,会加载整个XML文档到内存 | 同样加载整个文档,但API更轻量 |
| 操作灵活性 | 支持XPath查询,功能全面 | 支持Linq查询,操作更直观 |
动态更新XML的注意事项
- 修改XML前最好先备份原文件,避免修改出错导致数据丢失。
- 如果XML文件有命名空间,需要使用
XmlNamespaceManager(XmlDocument方式)或者带命名空间的查询(Linq to XML方式)来定位节点。 - 修改完成后要及时调用保存方法,否则修改不会写入文件。
- 操作XML文件时要注意文件权限,确保程序有读写文件的权限,避免抛出IO异常。
如果XML文件较大,不建议一次性加载到内存修改,可以考虑使用XmlReader和XmlWriter配合进行流式修改,减少内存占用。
C#XMLXmlDocumentLinq_to_XML动态更新修改时间:2026-07-11 17:45:41