linq to xml是.NET Framework 3.5及以上版本引入的XML处理技术,它基于LINQ查询语法,提供了更简洁的API来操作XML文档,相比传统的XmlDocument方式,代码可读性更强,操作效率更高。

linq to xml核心类介绍
使用linq to xml前需要先了解几个核心类,这些类都位于System.Xml.Linq命名空间下:
- XDocument:表示整个XML文档,用于加载、保存XML文件,是操作XML的入口类。
- XElement:表示XML中的一个元素节点,可包含子元素、属性、文本内容。
- XAttribute:表示XML元素的一个属性。
- XText:表示元素的文本内容。
加载与解析XML文件
首先需要在代码中引入System.Xml.Linq命名空间,然后通过XDocument.Load方法加载本地或远程的XML文件,也可以通过XDocument.Parse方法解析XML格式的字符串。
假设我们有一个名为students.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>
</Students>
加载该XML文件的代码如下:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 加载本地XML文件
XDocument doc = XDocument.Load("students.xml");
// 也可以解析XML字符串
// string xmlStr = "<Students><Student Id='1'><Name>张三</Name></Student></Students>";
// XDocument doc = XDocument.Parse(xmlStr);
Console.WriteLine("XML加载成功");
}
}
使用linq to xml查询XML内容
linq to xml最大的优势是支持LINQ查询语法,可以快速筛选、投影XML中的元素和属性。
查询所有学生信息
下面的代码查询XML中所有的Student元素,并输出每个学生的Id、姓名、年龄和班级:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = XDocument.Load("students.xml");
// 查询所有Student元素
var students = from s in doc.Descendants("Student")
select new
{
Id = s.Attribute("Id")?.Value,
Name = s.Element("Name")?.Value,
Age = s.Element("Age")?.Value,
Class = s.Element("Class")?.Value
};
foreach (var student in students)
{
Console.WriteLine($"学生Id:{student.Id},姓名:{student.Name},年龄:{student.Age},班级:{student.Class}");
}
}
}
按条件筛选学生
如果需要查询年龄大于20岁的学生,可以在查询中添加where条件:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = XDocument.Load("students.xml");
// 筛选年龄大于20的学生
var filterStudents = from s in doc.Descendants("Student")
where int.Parse(s.Element("Age").Value) > 20
select new
{
Name = s.Element("Name")?.Value,
Age = s.Element("Age")?.Value
};
foreach (var student in filterStudents)
{
Console.WriteLine($"姓名:{student.Name},年龄:{student.Age}");
}
}
}
新增XML节点
使用linq to xml新增节点非常简单,只需要创建对应的XElement和XAttribute对象,然后添加到父节点中即可。
下面的代码新增一个学生节点到Students根元素下:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = XDocument.Load("students.xml");
// 创建新的Student元素
XElement newStudent = new XElement("Student",
new XAttribute("Id", "3"),
new XElement("Name", "王五"),
new XElement("Age", "22"),
new XElement("Class", "计算机1班")
);
// 添加到根元素下
doc.Root.Add(newStudent);
// 保存修改后的XML
doc.Save("students.xml");
Console.WriteLine("新增学生节点成功");
}
}
修改XML节点与属性
修改XML内容时,先通过查询找到目标元素或属性,然后直接修改其Value属性即可。
下面的代码将Id为2的学生的年龄修改为23,班级修改为计算机3班:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = XDocument.Load("students.xml");
// 找到Id为2的Student元素
XElement targetStudent = doc.Descendants("Student")
.FirstOrDefault(s => s.Attribute("Id")?.Value == "2");
if (targetStudent != null)
{
// 修改年龄元素的值
targetStudent.Element("Age").Value = "23";
// 修改Class元素的值
targetStudent.Element("Class").Value = "计算机3班";
// 保存修改
doc.Save("students.xml");
Console.WriteLine("修改学生信息成功");
}
else
{
Console.WriteLine("未找到目标学生");
}
}
}
删除XML节点
删除XML节点时,先找到目标元素,然后调用Remove方法即可删除该元素及其所有子内容。
下面的代码删除Id为1的学生节点:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = XDocument.Load("students.xml");
// 找到Id为1的Student元素
XElement targetStudent = doc.Descendants("Student")
.FirstOrDefault(s => s.Attribute("Id")?.Value == "1");
if (targetStudent != null)
{
// 删除该节点
targetStudent.Remove();
// 保存修改
doc.Save("students.xml");
Console.WriteLine("删除学生节点成功");
}
else
{
Console.WriteLine("未找到目标学生");
}
}
}
创建新的XML文档
如果不需要加载现有XML,也可以直接通过linq to xml的API创建全新的XML文档,然后保存到文件。
下面的代码创建一个简单的图书信息XML文档:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 创建XML文档
XDocument newDoc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Books",
new XElement("Book",
new XAttribute("BookId", "1"),
new XElement("BookName", "C#编程入门"),
new XElement("Price", "59.9")
),
new XElement("Book",
new XAttribute("BookId", "2"),
new XElement("BookName", "LINQ实战"),
new XElement("Price", "69.9")
)
)
);
// 保存到文件
newDoc.Save("books.xml");
Console.WriteLine("新XML文档创建成功");
}
}
注意事项
- 操作XML文件时需要确保文件路径正确,且有对应的读写权限。
- 访问元素或属性前最好做空值判断,避免出现空引用异常。
- 修改XML后需要及时调用
Save方法保存,否则修改不会生效。 - 如果需要处理大型XML文件,建议结合
XmlReader使用,避免一次性加载整个文档占用过多内存。
linq_to_xmlXML操作C#XDocumentXML查询修改时间:2026-07-10 00:21:46