C#中的Linq to XML是.NET框架提供的XML处理技术,它将XML文档抽象为可编程的对象模型,结合Linq的查询能力,可以非常方便地完成XML文件的加载、解析、查询和修改操作,相比传统的XML DOM操作更加简洁直观。

Linq to XML核心类介绍
使用Linq to XML前需要先了解几个核心类,这些类都位于System.Xml.Linq命名空间下:
- XDocument:表示整个XML文档,可用于加载、保存XML文件,也可以直接构造XML文档结构。
- XElement:表示XML中的一个元素节点,是操作XML最常用的类,可获取元素的属性、子元素、文本内容等。
- XAttribute:表示XML元素的一个属性。
- XNamespace:用于处理XML命名空间相关操作。
加载XML文件
使用Linq to XML查询XML文件的第一步是加载XML内容,支持从文件路径、字符串、流等多种来源加载,以下是加载本地XML文件的示例:
using System;
using System.Xml.Linq;
using System.Linq;
class Program
{
static void Main()
{
// 加载本地XML文件,路径替换为实际文件路径
XDocument doc = XDocument.Load(@"D:test.xml");
// 也可以从XML字符串加载
// string xmlStr = "<root><user id="1">张三</user></root>";
// XDocument doc = XDocument.Parse(xmlStr);
Console.WriteLine("XML加载完成");
}
}
基础Linq查询XML方法
加载XML文档后,就可以通过Linq语法查询其中的元素和属性,以下是几种常见的查询场景。
查询所有指定名称的元素
假设我们有如下结构的XML文件,保存为test.xml:
<?xml version="1.0" encoding="utf-8"?> <users> <user id="1" age="20">张三</user> <user id="2" age="25">李四</user> <user id="3" age="22">王五</user> </users>
查询所有user元素的代码如下:
// 获取所有user元素
var allUsers = doc.Descendants("user");
foreach (var user in allUsers)
{
Console.WriteLine($"用户名:{user.Value},ID:{user.Attribute("id").Value}");
}
这里Descendants方法会返回文档中所有指定名称的后代元素,不管嵌套层级。
带条件的Linq查询
如果需要根据元素的属性或文本内容筛选数据,可以结合Linq的where子句实现:
// 查询年龄大于20岁的用户
var adultUsers = doc.Descendants("user")
.Where(u => int.Parse(u.Attribute("age").Value) > 20);
foreach (var user in adultUsers)
{
Console.WriteLine($"成年用户:{user.Value},年龄:{user.Attribute("age").Value}");
}
// 查询用户名为李四的元素
var liSi = doc.Descendants("user")
.FirstOrDefault(u => u.Value == "李四");
if (liSi != null)
{
Console.WriteLine($"找到李四,ID:{liSi.Attribute("id").Value}");
}
查询元素的属性和子元素
如果XML结构更复杂,包含嵌套子元素,也可以通过Linq查询提取对应内容,比如以下XML:
<?xml version="1.0" encoding="utf-8"?>
<orders>
<order id="1001">
<product>笔记本电脑</product>
<price>5999</price>
<count>2</count>
</order>
<order id="1002">
<product>鼠标</product>
<price>99</price>
<count>5</count>
</order>
</orders>
查询订单总价大于100的订单信息:
var highValueOrders = doc.Descendants("order")
.Where(o => int.Parse(o.Element("price").Value) * int.Parse(o.Element("count").Value) > 100)
.Select(o => new
{
OrderId = o.Attribute("id").Value,
Product = o.Element("product").Value,
TotalPrice = int.Parse(o.Element("price").Value) * int.Parse(o.Element("count").Value)
});
foreach (var order in highValueOrders)
{
Console.WriteLine($"订单ID:{order.OrderId},商品:{order.Product},总价:{order.TotalPrice}");
}
查询结果的转换与处理
Linq to XML查询得到的结果可以继续用Linq的其他操作处理,比如排序、分组、转换等:
// 按年龄升序排序用户
var sortedUsers = doc.Descendants("user")
.OrderBy(u => int.Parse(u.Attribute("age").Value))
.Select(u => new
{
Name = u.Value,
Age = u.Attribute("age").Value
});
foreach (var user in sortedUsers)
{
Console.WriteLine($"姓名:{user.Name},年龄:{user.Age}");
}
注意事项
- 操作XML元素属性或子元素时,需要先判断是否存在,避免空引用异常,比如用
u.Attribute("age")?.Value的方式获取可选属性。 - 如果XML包含命名空间,查询时需要带上对应的命名空间,否则会查询不到结果。
- 处理大XML文件时,优先使用
Descendants而不是Elements,Elements只会查询直接子元素,层级不对会导致查询失败。
C#Linq_to_XMLXML查询XML解析修改时间:2026-06-14 21:15:30