优先选 XElement,新项目起步直接使用;需精细控制 DOM、兼容老系统或满足严格格式要求时选 XmlNode。两者可稳定互转,实际项目常混合使用。

选 XmlNode 还是 XElement,关键看你的使用场景和开发目标,不是哪个“更好”,而是哪个更合适。
需要精细控制 DOM 或兼容老系统时,用 XmlNode
XmlDocument + XmlNode 是 .NET 早期就有的 DOM 模型,完全遵循 W3C 规范。如果你要:
- 精确保留注释、处理指令、命名空间前缀顺序或空白格式(比如银行/政务报文必须严格合规)
- 用 XPath 1.0 做复杂轴导航(如
preceding-sibling::、ancestor-or-self::) - 对接遗留系统、第三方 SDK 或要求返回
XmlNode的 API(比如某些 Web Service 客户端) - 在同一个文档中频繁混用元素、属性、文本、CDATA 等多种节点类型并分别处理
写新代码、重逻辑轻格式时,优先用 XElement
XElement 是 LINQ to XML 的核心,语法简洁、API 更符合现代 C# 风格。适合:
- 快速构建、查询、修改 XML(尤其配合 LINQ 查询,比如
doc.Descendants("book").Where(x => (int?)x.Element("price") > 100)) - 与 LINQ、匿名类型、JSON 转换等现代特性协同(
XElement.Parse(jsonString.ToXElement())类思路常见) - 配置文件读写、日志模板、内部数据序列化等对格式宽容的场景
- 团队新人多、希望代码易读易维护(
new XElement("user", new XAttribute("id", 123), "Alice")比手动 CreateElement + SetAttribute 直观得多)
两者能互相转换,不必强求统一
实际项目中经常混合使用。比如用 XElement 快速生成结构,再转成 XmlNode 交给某个老组件处理;或者用 XmlDocument.Load() 读取原始 XML,再用 XDocument.Load(xmlNode.CreateReader()).Root 转成 XElement 做后续加工。
转换方法很稳定:
-
XmlNode → XElement:用
XDocument.Load(node.CreateReader()).Root -
XElement → XmlNode:用
new XmlDocument().ReadNode(element.CreateReader())(注意返回的是新 XmlDocument,需取.DocumentElement或遍历获取目标节点)
小建议:新项目起步直接用 XElement,老项目维护按需保留 XmlNode
除非有明确的合规性、互操作性或历史约束,否则从 XElement 开始更省力。它不比 XmlNode 功能少,只是抽象层级更高、默认行为更“聪明”。而 XmlNode 不会消失,.NET 8/9 依然完整支持,该用的时候照用就行。










