C#中删除XML节点需先定位再调用Remove()或RemoveAll();XDocument推荐用Descendants()/Elements()查找后Remove(),XmlDocument须用RemoveChild()且倒序遍历多节点。

在C#中删除XML节点,关键是先定位目标节点,再调用 Remove() 或 RemoveAll() 方法;注意操作前要确保节点非空,且对 XDocument 或 XmlDocument 的处理方式略有不同。
使用 XDocument 删除指定元素(推荐 LINQ to XML)
XDocument 是现代、轻量、支持LINQ查询的XML处理方式,适合大多数场景。删除节点前需先查找到它,再调用 Remove()。
- 用
Descendants()或Elements()查找匹配的节点,例如:doc.Descendants("Book").FirstOrDefault(x => (string)x.Attribute("id") == "102")?.Remove(); - 删除所有同名节点:
doc.Root?.Elements("Author").Remove(); - 删除子节点但保留父节点内容:
node.Element("Price")?.Remove(); - 修改后别忘了保存:
doc.Save("books.xml");
使用 XmlDocument 删除节点(传统 DOM 方式)
XmlDocument 需通过 XmlNode 对象操作,删除前必须从父节点调用 RemoveChild(),不能直接在节点上调用 Remove()。
- 查找并删除第一个匹配节点:
var node = doc.SelectSingleNode("//Book[@id='102']"); if (node != null) node.ParentNode.RemoveChild(node); - 删除所有符合条件的节点,需倒序遍历(避免索引错乱):
var nodes = doc.SelectNodes("//Comment"); for (int i = nodes.Count - 1; i >= 0; i--) nodes[i].ParentNode.RemoveChild(nodes[i]); - 清空某元素全部子节点(不删自身):
element.RemoveAll();
删除时常见问题与注意事项
实际编码中容易忽略这些细节,导致异常或静默失败:
- 空引用异常最常见——务必检查
node、ParentNode是否为null,建议配合空条件操作符(?.)或if判断 -
XDocument中Remove()是扩展方法,需引入System.Xml.Linq命名空间 -
XmlDocument的RemoveChild()要求传入的节点必须属于当前文档,跨文档移动后需先ImportNode() - 删除后如需重新加载或序列化,注意编码是否一致(如 UTF-8 带 BOM),否则保存可能出乱码
简单示例:删除所有无标题的 Book 元素
用 XDocument 实现一行逻辑清晰的清理:
doc.Root?.Elements("Book")
.Where(b => string.IsNullOrWhiteSpace(b.Element("Title")?.Value))
.ToList()
.ForEach(b => b.Remove());
doc.Save("library_clean.xml");










