在C#开发场景中,XML文件常被用来存储配置信息、传输结构化数据,Linq to XML是.NET Framework 3.5及以后版本提供的XML处理方案,它基于LINQ查询语法,操作比传统XmlDocument更直观,代码量也更少。下面我们通过具体示例逐步讲解其使用方法。

Linq to XML核心类介绍
使用Linq to XML前需要先引入System.Xml.Linq命名空间,其中最常用的几个类如下:
- XDocument:表示整个XML文档,可用于加载、保存XML文件,也可以直接构造新的XML文档
- XElement:表示XML中的一个元素节点,是操作XML的核心类,可获取元素名称、值、属性、子元素等
- XAttribute:表示XML元素的一个属性
- XNode:表示XML节点的基类,XElement、XText等都继承自该类
加载和读取XML文件
首先我们准备一个测试用的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>
我们可以通过XDocument.Load方法加载本地XML文件,也可以通过XDocument.Parse方法加载XML字符串,以下是加载文件并读取所有学生信息的代码示例:
using System;
using System.Linq;
using System.Xml.Linq;
namespace LinqToXmlDemo
{
class Program
{
static void Main(string[] args)
{
// 加载本地XML文件,路径替换为实际文件路径
XDocument doc = XDocument.Load(@"D:test.xml");
// 获取根元素下的所有student子元素
var students = doc.Root.Elements("student");
// 遍历输出每个学生的信息
foreach (var student in students)
{
// 获取id属性值
string id = student.Attribute("id").Value;
// 获取name子元素的值
string name = student.Element("name").Value;
// 获取age子元素的值
string age = student.Element("age").Value;
// 获取class子元素的值
string className = student.Element("class").Value;
Console.WriteLine($"学号:{id},姓名:{name},年龄:{age},班级:{className}");
}
}
}
}
使用LINQ查询筛选XML数据
Linq to XML的优势在于可以结合LINQ查询语法快速筛选数据,比如我们需要查询所有20岁的学生,或者查询计算机1班的学生,代码实现如下:
using System;
using System.Linq;
using System.Xml.Linq;
namespace LinqToXmlDemo
{
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"D:test.xml");
// 查询所有年龄为20的学生
var age20Students = from s in doc.Root.Elements("student")
where s.Element("age").Value == "20"
select s;
Console.WriteLine("年龄为20的学生:");
foreach (var student in age20Students)
{
Console.WriteLine($"姓名:{student.Element("name").Value},班级:{student.Element("class").Value}");
}
// 查询计算机1班的学生
var class1Students = doc.Root.Elements("student")
.Where(s => s.Element("class").Value == "计算机1班");
Console.WriteLine("n计算机1班的学生:");
foreach (var student in class1Students)
{
Console.WriteLine($"姓名:{student.Element("name").Value},年龄:{student.Element("age").Value}");
}
}
}
}
修改XML节点和属性
使用Linq to XML修改XML内容也非常简单,我们可以直接修改元素的值、属性的值,也可以添加新的子元素或者删除节点,以下是修改示例:
using System;
using System.Linq;
using System.Xml.Linq;
namespace LinqToXmlDemo
{
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"D:test.xml");
// 找到id为1的学生节点
var targetStudent = doc.Root.Elements("student")
.FirstOrDefault(s => s.Attribute("id").Value == "1");
if (targetStudent != null)
{
// 修改年龄元素的值
targetStudent.Element("age").Value = "22";
// 修改id属性的值
targetStudent.Attribute("id").Value = "1001";
// 添加新的子元素score
targetStudent.Add(new XElement("score", "95"));
// 保存修改后的XML到新文件
doc.Save(@"D:test_modified.xml");
Console.WriteLine("XML修改完成,已保存到新文件");
}
}
}
}
创建新的XML文件
除了解析已有的XML文件,我们也可以用Linq to XML直接构造新的XML文档并保存,代码示例如下:
using System;
using System.Xml.Linq;
namespace LinqToXmlDemo
{
class Program
{
static void Main(string[] args)
{
// 构造新的XML文档
XDocument newDoc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("books",
new XElement("book",
new XAttribute("id", "1"),
new XElement("title", "C#编程入门"),
new XElement("author", "张三"),
new XElement("price", "59.9")
),
new XElement("book",
new XAttribute("id", "2"),
new XElement("title", "LINQ实战"),
new XElement("author", "李四"),
new XElement("price", "69.9")
)
)
);
// 保存XML文件
newDoc.Save(@"D:new_books.xml");
Console.WriteLine("新XML文件创建完成");
}
}
}
注意事项
在使用Linq to XML时需要注意几个问题:首先获取元素或属性前最好先判断是否存在,避免出现空引用异常,比如可以用Element("name")?.Value的写法;其次XML中的元素值都是字符串类型,如果需要数值类型需要手动转换;最后如果XML文件较大,频繁加载整个文档可能占用较多内存,此时可以考虑流式读取的方式,但Linq to XML本身更适合中小体积XML文件的处理场景。
C#Linq_to_XMLXML解析XML文件修改时间:2026-07-03 00:30:35