LINQ to XML 查询 XML 的核心是将 XML 视为对象操作,分三步:加载(XDocument.Load、XElement.Load/Parse)、建模(XDocument/XElement)、查询(Elements/Element/Attribute 配合 Where/Select);支持类型安全转换、Descendants 灵活查找、可变修改及保存,并注意 PreserveWhitespace 保留格式。

用 LINQ to XML 查询 XML,核心是把 XML 当成对象来操作,不用写一堆 XPath 或手动遍历节点。关键三步:加载 XML、用 XDocument 或 XElement 建模、用 LINQ 语法筛选/投影。
加载 XML 数据
支持从文件、字符串或流中读取:
-
XDocument.Load("config.xml")—— 读整个文档(含声明、注释) -
XElement.Load("data.xml")—— 只读根元素及其子树(更常用) -
XElement.Parse("—— 解析字符串 ")
查询子元素和属性
用 Elements()、Element()、Attribute() 配合 LINQ 的 Where、Select:
doc.Root.Elements("Book").Where(b => (string)b.Attribute("type") == "fiction")doc.Root.Elements("Book").Select(b => new { Title = b.Element("Title")?.Value, Id = (int)b.Attribute("id") })- 注意:属性和元素值要显式转类型(如
(string)、(int)),空时不会报错,返回 null 或默认值
处理嵌套与多级结构
用 Descendants() 查任意层级的同名元素,比 Elements() 更灵活:
-
doc.Descendants("Author").Where(a => a.Value.Contains("Lee"))—— 找所有 Author 元素,不管在哪层 -
doc.Root.Element("Library").Elements("Shelf").Elements("Book")—— 明确路径导航 - 避免过度用
Descendants,性能不如限定范围的Elements
修改和保存结果
LINQ to XML 是可变模型,查完可直接改,再保存:
var book = doc.Root.Elements("Book").First(); book.SetElementValue("Price", "29.99");book.Add(new XElement("Tag", "bestseller"));-
doc.Save("updated.xml");或doc.ToString()获取字符串
不复杂但容易忽略:XElement 默认忽略空白文本节点,如果 XML 中有换行缩进,又需要保留格式,加载时加 LoadOptions.PreserveWhitespace。










