C# XDocument和XmlDocument有什么区别

12次阅读

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

C# XDocument和XmlDocument有什么区别

XDocumentXmlDocument 都是 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 则需显式创建节点、追加子节点、管理命名空间前缀等:

  • 必须用 CreateElementCreateAttributeappendChild 等方法
  • 查询依赖 SelectnodesGetElementsByTagName,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。

text=ZqhQzanResources