XDocument 性能更优,适合新建、查询、修改和序列化小到中等 XML;XmlDocument 在复杂 XPath、节点事件和 DOM 兼容场景不可替代。

XDocument 通常比 XmlDocument 性能更好,尤其在新建、查询、修改和序列化小到中等规模 XML 时;但 XmlDocument 在某些特定场景(如反复读取、XPath 复杂查询、或需 DOM 兼容性)仍有优势。
内存占用与创建开销更小
XDocument 基于 LINQ to XML 设计,内部结构更轻量,节点对象更精简。创建一个简单 XML 文档时,XDocument 的对象分配更少,GC 压力更低。XmlDocument 则依赖传统的 XmlNode 层级继承体系(XmlElement、XmlText 等),每个节点都是完整类实例,内存开销明显更高。
- 新建空文档:XDocument 构造快约 20%–40%
- 加载 100KB 以内 XML 字符串:XDocument.Load() 平均快 15%–30%,取决于内容结构
- 频繁构建临时 XML 片段(如 API 响应组装):XDocument 更适合
查询和遍历更高效
XDocument 原生支持 LINQ 查询,底层对子节点列表做了优化(例如 XElement.Nodes() 返回的是轻量枚举器,而非 XmlNodeList 包装器)。XmlDocument 的 SelectNodes() 或 GetElementsByTagName() 需要创建 XmlNodeList 对象并维护活动引用,开销更大。
- 查找所有同名子元素:XElement.Elements("item") 比 XmlDocument.GetElementsByTagName("item") 快且代码更简洁
- 链式查询(如 .Elements().Elements().Where(...)):XDocument 的延迟执行 + 内存局部性更好
- 注意:若用 XPath 查询(如 XPathSelectElements),两者底层都走类似路径,差距缩小,但 XDocument 仍略优
修改和构建操作更直观、开销更低
XDocument 支持函数式构建(如 new XElement("root", items.Select(x => new XElement("item", x.Value)))),避免反复调用 AppendChild 等 DOM 方法。XmlDocument 修改需显式创建节点、设置属性、再挂载,每步都涉及类型检查和事件触发(如 NodeInserted),额外开销明显。
- 批量添加 1000 个元素:XDocument 构建耗时约为 XmlDocument 的 60%–70%
- 属性设置:XAttribute 比 XmlAttribute 轻量,无命名空间缓存等附加逻辑
- 删除节点:XElement.Remove() 直接操作父节点集合;XmlDocument 移除需先定位再调用 RemoveChild,步骤更多
XmlDocument 不可替代的适用场景
如果项目重度依赖 XPath 复杂查询(含轴运算、变量绑定)、需要节点事件(NodeChanged/NodeInserted)、或必须与旧系统(如某些 WebService、COM 组件)交互(它们只认 XmlNode),XmlDocument 仍是刚需。它还支持 DTD 验证、Entity 解析等 XDocument 明确不支持的特性。
- 需用 //book[price>10]/title 这类带谓词和比较的 XPath:XmlDocument + XPathNavigator 更稳定
- 要求节点被修改时自动触发回调:XmlDocument 提供内置事件机制
- 集成遗留 COM 组件(如 MSXML):只能传入 XmlDocument 或其节点
基本上就这些。日常开发推荐优先用 XDocument,性能更优、写法更现代;只有明确需要 XmlDocument 特性时,才切换回去。










