XDocument 和 XmlDocument 分属不同技术体系:XDocument 是 LINQ to XML 的现代声明式 API,轻量高效,适合新项目;XmlDocument 是传统 DOM 实现,命令式操作,兼容性强但较冗繁。

XDocument 和 XmlDocument 都是 C# 中用于处理 XML 的类,但它们属于不同技术体系,设计理念、API 风格、性能特征和适用场景差异明显。
所属框架与设计哲学不同
XDocument 是 LINQ to XML 的核心类,属于 .NET Framework 3.5 引入的现代 XML API,强调函数式、声明式编程风格,与 LINQ 深度集成;XmlDocument 是传统的 DOM(Document Object Model)实现,源自 .NET Framework 1.0,遵循 W3C DOM 标准,以节点树方式建模,操作偏命令式。
API 使用体验差异大
XDocument 提供更简洁直观的语法:
- 支持直接用 XElement / XAttribute 构造 XML,例如 new XElement("book", new XAttribute("id", "1"), "C# Guide")
- 查询用 LINQ 表达式,如 doc.Descendants("book").Where(x => (string)x.Attribute("id") == "1")
- 修改链式调用友好,如 element.Add(new XElement("price", "59.9"))
XmlDocument 则需显式创建节点、追加子节点、管理命名空间前缀等:
- 必须用 CreateElement、CreateAttribute、AppendChild 等方法
- 查询依赖 SelectNodes 或 GetElementsByTagName,XPath 字符串易出错
- 属性/文本内容需手动转换类型,如 node.Attributes["id"].Value
内存模型与性能表现有别
XDocument 默认采用轻量级、不可变(逻辑上)的节点模型,内部使用更紧凑的数据结构,创建和遍历小到中型 XML 通常更快,内存占用略低;XmlDocument 是标准 DOM 实现,每个节点都是完整对象,支持事件(如 NodeChanged)、深度克隆、保留原始格式细节(如空白文本节点),适合需要精细控制解析行为或兼容老系统(如 WebService 返回的 XmlDocument)的场景。
互操作性与迁移建议
两者可互相转换:
- XDocument → XmlDocument:new XmlDocument().Load(xDoc.CreateReader())
- XmlDocument → XDocument:XDocument.Load(xmlDoc.CreateNavigator().ReadSubtree()) 或先保存为字符串再加载
新项目优先选 XDocument;维护旧代码或对接要求 XmlDocument 的组件(如某些 ASP.NET WebForm 控件、WCF 配置)时仍需使用 XmlDocument。










