C#修改xml节点应使用XmlDocument或XDocument类,避免字符串替换;XmlDocument适合小中型文件且API直观,XDocument支持linq更现代;需注意加载、定位、修改、保存全流程及编码、命名空间、空引用等常见问题。

用C#修改XML节点,核心是加载文档、定位节点、更新值或属性,再保存。推荐用 XmlDocument(适合小中型文件,API直观)或 XDocument(LINQ支持好,更现代)。别直接字符串替换,容易破坏结构。
用 XmlDocument 修改节点内容
适合快速定位并修改文本值、属性,尤其已有明确XPath路径时:
- 用 Load() 或 LoadXml() 加载XML
- 用 SelectSinglenode() 或 SelectNodes() 找到目标节点(支持XPath)
- 修改 InnerText(改文本)、InnerXml(含子元素)、或 SetAttribute()(改属性)
- 调用 Save() 写回文件
示例:把
var doc = new XmlDocument(); doc.Load("config.xml"); var nameNode = doc.SelectSingleNode("//user/name"); if (nameNode != null) nameNode.InnerText = "李四"; doc.Save("config.xml");
用 XDocument 动态更新(推荐新项目)
语法更简洁,支持LINQ查询,修改更安全:
- 用 XDocument.Load() 加载
- 用 Descendants() 或 Elements() 查找节点
- 直接赋值修改 Value(文本)、SetAttributeValue()(属性)
- 调用 Save() 保存
示例:更新所有 status=”pending” 的订单状态为 “processed”
var xdoc = XDocument.Load("orders.xml"); xdoc.Descendants("order") .Where(e => e.Attribute("status")?.Value == "pending") .ToList() .ForEach(e => e.SetAttributeValue("status", "processed")); xdoc.Save("orders.xml");
增删节点与处理不存在的节点
修改前先确保父节点存在,避免 NullReferenceException:
- 新增节点:用 CreateElement() + appendChild()(XmlDocument),或 new XElement() + Add()(XDocument)
- 删除节点:调用 Remove() 或 RemoveAll()
- 安全查找:用 ?.(空条件运算符)或显式判空,尤其在XPath可能不匹配时
比如添加一个新配置项:<setting key="theme" value="dark"></setting>,先找到
注意事项和常见坑
实际写入时容易忽略这些细节:
- 文件被其他进程占用会抛 IOException —— 检查是否已用记事本打开该XML
- 中文乱码?保存时指定编码:
doc.Save(new streamWriter("file.xml", false, Encoding.UTF8)) - 修改后没保存?记得调用 Save(),不是只改内存对象
- XPath 区分大小写,且默认不识别命名空间 —— 如有 xmlns,需用 XmlNamespaceManager 配合
基本上就这些。选 XmlDocument 还是 XDocument,看团队习惯和项目需求。小文件、简单操作两者都行;复杂查询或需要链式处理,XDocument 更顺手。