在CSharp开发场景中,XML常作为配置文件或数据交换格式使用,Linq to XML提供了简洁高效的API来操作这类文件,相比传统的XmlDocument方式,代码可读性更强,编写效率更高。

Linq读取XML的基础准备
首先需要引入必要的命名空间,Linq to XML的核心类都位于System.Xml.Linq命名空间中,使用前需要在代码文件顶部添加引用。
using System; using System.Xml.Linq; using System.Linq;
假设我们有一个存储学生信息的XML文件,内容如下,后续示例都将基于这个文件展开:
<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student Id="1">
<Name>张三</Name>
<Age>20</Age>
<Class>计算机1班</Class>
</Student>
<Student Id="2">
<Name>李四</Name>
<Age>21</Age>
<Class>计算机2班</Class>
</Student>
<Student Id="3">
<Name>王五</Name>
<Age>20</Age>
<Class>计算机1班</Class>
</Student>
</Students>
加载XML文件
使用Linq读取XML的第一步是加载XML文件,XDocument类提供了Load方法可以直接从文件路径加载XML内容,也可以通过Parse方法加载XML字符串。
// 从文件路径加载XML
XDocument doc = XDocument.Load("Students.xml");
// 如果是XML字符串,可以使用Parse方法
// string xmlStr = "<Students><Student>test</Student></Students>";
// XDocument doc = XDocument.Parse(xmlStr);
基础查询:读取所有学生信息
加载完成后,可以通过Descendants方法获取指定名称的所有子元素,结合Linq的查询语法或方法语法提取需要的数据。
// 方法语法查询所有学生信息
var allStudents = doc.Descendants("Student")
.Select(s => new
{
Id = s.Attribute("Id")?.Value,
Name = s.Element("Name")?.Value,
Age = s.Element("Age")?.Value,
Class = s.Element("Class")?.Value
})
.ToList();
// 输出所有学生信息
foreach (var stu in allStudents)
{
Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},年龄:{stu.Age},班级:{stu.Class}");
}
条件查询:筛选符合要求的节点
可以在Linq查询中添加where条件,实现特定节点的筛选,比如查询年龄是20岁的学生信息。
// 查询年龄为20岁的学生
var age20Students = doc.Descendants("Student")
.Where(s => s.Element("Age")?.Value == "20")
.Select(s => new
{
Id = s.Attribute("Id")?.Value,
Name = s.Element("Name")?.Value,
Class = s.Element("Class")?.Value
})
.ToList();
Console.WriteLine("年龄为20岁的学生:");
foreach (var stu in age20Students)
{
Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},班级:{stu.Class}");
}
复杂查询:多条件与属性读取
如果需要同时匹配多个条件,比如查询计算机1班且年龄为20岁的学生,可以组合多个where条件,同时支持读取元素的属性值和子元素值。
// 查询计算机1班且年龄为20岁的学生
var targetStudents = from s in doc.Descendants("Student")
where s.Element("Age")?.Value == "20"
&& s.Element("Class")?.Value == "计算机1班"
select new
{
Id = s.Attribute("Id")?.Value,
Name = s.Element("Name")?.Value
};
Console.WriteLine("计算机1班且年龄为20岁的学生:");
foreach (var stu in targetStudents)
{
Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name}");
}
注意事项
- 使用
Element方法获取子元素时,如果元素不存在会返回null,因此需要添加null判断避免空引用异常,示例中使用了?.运算符简化判断。 Attribute方法用于获取元素的属性,同样需要做null判断,防止属性不存在时出错。- 如果XML文件有命名空间,需要使用
XNamespace配合元素名查询,否则无法匹配到对应节点。 - 读取到的元素值默认是字符串类型,如果需要转换为其他类型,比如年龄转为int,可以使用
int.Parse或Convert.ToInt32方法,注意处理转换异常。
使用Linq读取XML时,尽量优先使用方法语法,代码会更简洁,同时合理利用匿名类型可以快速封装需要的数据,减少冗余代码。