推荐优先使用XDocument删除XML节点,先Load加载、Descendants+Where定位、ToList后Remove、最后Save;XmlDocument需通过ParentNode.RemoveChild;注意空节点清理、命名空间和线程安全。

在C#中从XML文件中删除节点,核心是使用XmlDocument或XDocument(LINQ to XML)加载文档,定位目标节点,再调用删除方法。推荐优先使用XDocument,语法更简洁、功能更现代。
使用XDocument删除指定名称的节点
适用于按元素名、属性值或条件批量删除节点。先加载XML,再用LINQ查询定位,最后调用Remove():
- 用
XDocument.Load("path.xml")加载文件 - 用
Descendants("NodeName")查找所有同名节点,或加Where()筛选(如e.Attribute("id")?.Value == "123") - 对匹配到的节点调用
Remove()(注意:必须在集合上操作,不能边遍历边删,建议转成ToList()) - 调用
Save()写回文件
示例:删除所有中status="inactive"的节点
doc.Descendants("Item")
.Where(e => e.Attribute("status")?.Value == "inactive")
.ToList()
.ForEach(e => e.Remove());
doc.Save("data.xml");
使用XmlDocument删除子节点(需指定父节点)
XmlDocument操作稍显繁琐,必须通过父节点调用RemoveChild(),不能直接删自身:
- 用
Load()加载XML - 用
SelectNodes()或SelectSingleNode()定位目标节点(支持XPath) - 获取其
ParentNode,再调用RemoveChild(目标节点) - 调用
Save()持久化
示例:删除根下第一个节点
doc.Load("users.xml");
XmlNode node = doc.SelectSingleNode("/Users/User[1]");
if (node != null && node.ParentNode != null)
node.ParentNode.RemoveChild(node);
doc.Save("users.xml");
删除空节点或无用文本节点(清理用)
有时需要清理空白文本节点(#text)或内容为空的元素,避免格式混乱:
- 遍历所有节点时检查
NodeType == XmlNodeType.Element且IsEmpty为true,或InnerText.Trim() == "" - 对满足条件的节点,同样通过父节点删除
- 注意:直接删
#text节点可能影响排版,建议仅在确定安全时操作
注意事项与常见问题
删除前务必确认节点存在,否则会抛出NullReferenceException;修改后记得Save(),否则只在内存中生效。若XML有命名空间,查询时必须声明并使用XNamespace,否则找不到节点。多线程环境下操作同一文件需加锁,避免读写冲突。










