LINQ to XML 是 .NET 中轻量级、函数式、强类型的 XML 操作 API,适用于内存中构建、查询和修改 XML;它不解析 DTD、不自动绑定命名空间前缀、不映射 XSD,且在处理超大 XML 时存在性能瓶颈。
LINQ to XML 是 .NET 中用于内存中构建、查询和修改 XML 的轻量级 API,它不是对传统
或
的简单封装,而是以函数式、链式、强类型方式操作 XML 的现代方案——它不解析 DTD,不支持命名空间前缀自动绑定(需显式处理),也不直接映射到 XSD;用它写代码快,但若 XML 极大或需流式处理,它反而会成为瓶颈。
如何创建和加载 XML 文档(
vs
)
表示完整 XML 文档(含声明、注释、处理指令),而
仅表示一个元素节点(最常用)。多数场景下,你只需用
就够了,除非明确需要保存 XML 声明(如
)。
常见误用:用
加载纯片段(如
)没问题,但若传入不含根节点的字符串(如
),会抛出
—— 因为这不是合法 XML 文档。
从字符串加载完整文档:
从字符串加载单个元素(推荐日常使用):
新建空元素并添加子节点:
如何用 LINQ 查询 XML 节点(
和
的区别)
只查**直接子元素**,层级严格;
查**所有后代元素**,深度不限。这是最常混淆的点,直接影响查询结果是否为空。
C知道
CSDN推出的一款AI技术问答工具
下载
例如有 XML:
,想取所有
元素:
✅ 正确(跨层级):
❌ 错误(只查第一层):
⚠️ 注意大小写敏感:
不会匹配
,XML 名称区分大小写
如何安全修改和保存(避免
)
调用
或
时,若目标不存在,返回
,直接链式调用
会崩。别依赖“它肯定存在”。必须检查或用空合并操作符。
安全取属性值(属性可能不存在):
安全取子元素文本(元素可能不存在):
批量更新属性(先查再改,避免 foreach 中移除导致异常):
保存到文件:
真正难的不是语法,是判断该用
还是
、该用
还是
、以及在多层嵌套中是否遗漏了命名空间(
必须显式声明并参与所有查找)。这些地方一错,程序不报错但查不到数据,调试起来比 XML 解析异常还费时间。
XDocumentXmlReaderXDocumentXElementXDocumentXElementXElementXDocument.Load()- A
- A
- B
System.Xml.XmlExceptionXDocument doc = XDocument.Parse("- A
");XElement root = XElement.Parse("- A
");XElement root = new XElement("root", new XElement("item", new XAttribute("id", "1"), "A"));Descendants()Elements()Elements()Descendants()C# in Depth Jon Skeet namevar names = root.Descendants("name").Select(x => x.Value).ToList();var names = root.Elements("name").Select(x => x.Value).ToList(); // 返回空列表root.Descendants("NAME")NullReferenceExceptionElement()Attribute()null.Valuestring id = elem.Attribute("id")?.Value ?? "default";string title = elem.Element("title")?.Value ?? string.Empty;foreach (var item in root.Descendants("item").ToList()) { item.SetAttributeValue("processed", "true"); }root.Save("output.xml"); // 自动缩进,但不保留原始注释和空白;如需精确格式控制,得用 XmlWriterSettingsXElementXDocumentElements()Descendants()XNamespace