在C#开发中,处理XML文件是常见的需求,不同的场景适合不同的读写方案,下面将介绍三种主流的实现方式,搭配完整代码示例说明具体用法。

一、使用XmlDocument类读写XML
XmlDocument是基于文档对象模型(DOM)的XML处理类,适合需要灵活操作XML节点结构的场景。
1.1 写入XML文件
下面的代码演示了如何创建一个包含学生信息的XML文件:
using System.Xml;
class XmlDocumentWriteExample
{
static void Main()
{
// 创建XmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// 创建XML声明节点
XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDecl);
// 创建根节点
XmlElement root = xmlDoc.CreateElement("Students");
xmlDoc.AppendChild(root);
// 创建第一个学生节点
XmlElement student1 = xmlDoc.CreateElement("Student");
// 设置学生节点的id属性
student1.SetAttribute("id", "1");
// 创建姓名字子节点
XmlElement name1 = xmlDoc.CreateElement("Name");
name1.InnerText = "张三";
student1.AppendChild(name1);
// 创建年龄子节点
XmlElement age1 = xmlDoc.CreateElement("Age");
age1.InnerText = "20";
student1.AppendChild(age1);
root.AppendChild(student1);
// 创建第二个学生节点
XmlElement student2 = xmlDoc.CreateElement("Student");
student2.SetAttribute("id", "2");
XmlElement name2 = xmlDoc.CreateElement("Name");
name2.InnerText = "李四";
student2.AppendChild(name2);
XmlElement age2 = xmlDoc.CreateElement("Age");
age2.InnerText = "22";
student2.AppendChild(age2);
root.AppendChild(student2);
// 保存XML到文件
xmlDoc.Save("students.xml");
System.Console.WriteLine("XML文件写入成功");
}
}1.2 读取XML文件
读取上述生成的XML文件,遍历所有学生信息:
using System.Xml;
class XmlDocumentReadExample
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
// 加载XML文件
xmlDoc.Load("students.xml");
// 获取根节点
XmlNode root = xmlDoc.DocumentElement;
// 遍历所有Student节点
XmlNodeList studentNodes = root.SelectNodes("Student");
foreach (XmlNode studentNode in studentNodes)
{
// 获取id属性
string id = studentNode.Attributes["id"].Value;
// 获取姓名节点内容
string name = studentNode.SelectSingleNode("Name").InnerText;
// 获取年龄节点内容
string age = studentNode.SelectSingleNode("Age").InnerText;
System.Console.WriteLine($"学生ID:{id},姓名:{name},年龄:{age}");
}
}
}二、使用XmlSerializer序列化读写XML
XmlSerializer适合将对象直接序列化为XML,或者将XML反序列化为对象,开发效率更高,适合强类型场景。
2.1 定义实体类
首先定义与XML结构对应的学生实体类:
using System.Collections.Generic;
using System.Xml.Serialization;
// 根节点对应的类
[XmlRoot("Students")]
public class StudentList
{
// 子节点集合
[XmlElement("Student")]
public List<Student> Students { get; set; } = new List<Student>();
}
// 学生节点对应的类
public class Student
{
// id属性
[XmlAttribute("id")]
public string Id { get; set; }
// 姓名元素
[XmlElement("Name")]
public string Name { get; set; }
// 年龄元素
[XmlElement("Age")]
public string Age { get; set; }
}2.2 序列化对象到XML
将学生对象集合序列化为XML文件:
using System.IO;
using System.Xml.Serialization;
class XmlSerializerWriteExample
{
static void Main()
{
StudentList studentList = new StudentList();
studentList.Students.Add(new Student { Id = "1", Name = "张三", Age = "20" });
studentList.Students.Add(new Student { Id = "2", Name = "李四", Age = "22" });
// 创建XmlSerializer实例,指定根类型
XmlSerializer serializer = new XmlSerializer(typeof(StudentList));
// 创建文件流
using (FileStream fs = new FileStream("students_serialize.xml", FileMode.Create))
{
// 序列化对象到文件流
serializer.Serialize(fs, studentList);
}
System.Console.WriteLine("序列化XML成功");
}
}2.3 反序列化XML到对象
将XML文件反序列化为学生对象集合:
using System.IO;
using System.Xml.Serialization;
class XmlSerializerReadExample
{
static void Main()
{
XmlSerializer serializer = new XmlSerializer(typeof(StudentList));
using (FileStream fs = new FileStream("students_serialize.xml", FileMode.Open))
{
// 反序列化得到对象
StudentList studentList = (StudentList)serializer.Deserialize(fs);
foreach (Student student in studentList.Students)
{
System.Console.WriteLine($"学生ID:{student.Id},姓名:{student.Name},年龄:{student.Age}");
}
}
}
}三、使用LINQ to XML读写XML
LINQ to XML是.NET Framework 3.5之后引入的轻量级XML处理方案,语法简洁,支持LINQ查询,是现在更推荐的使用方式。
3.1 写入XML文件
使用LINQ to XML的XDocument类创建XML文件:
using System.Xml.Linq;
class LinqToXmlWriteExample
{
static void Main()
{
// 创建XDocument实例
XDocument xDoc = new XDocument(
// 创建XML声明
new XDeclaration("1.0", "utf-8", null),
// 创建根节点
new XElement("Students",
// 第一个学生节点
new XElement("Student",
new XAttribute("id", "1"),
new XElement("Name", "张三"),
new XElement("Age", "20")
),
// 第二个学生节点
new XElement("Student",
new XAttribute("id", "2"),
new XElement("Name", "李四"),
new XElement("Age", "22")
)
)
);
// 保存XML文件
xDoc.Save("students_linq.xml");
System.Console.WriteLine("LINQ to XML写入成功");
}
}3.2 读取XML文件
读取XML文件并查询符合条件的学生信息:
using System.Linq;
using System.Xml.Linq;
class LinqToXmlReadExample
{
static void Main()
{
// 加载XML文件
XDocument xDoc = XDocument.Load("students_linq.xml");
// 使用LINQ查询所有学生节点
var students = xDoc.Descendants("Student")
.Select(s => new
{
Id = s.Attribute("id").Value,
Name = s.Element("Name").Value,
Age = s.Element("Age").Value
});
foreach (var student in students)
{
System.Console.WriteLine($"学生ID:{student.Id},姓名:{student.Name},年龄:{student.Age}");
}
// 查询年龄大于20的学生
var adultStudents = students.Where(s => int.Parse(s.Age) > 20);
System.Console.WriteLine("年龄大于20的学生:");
foreach (var student in adultStudents)
{
System.Console.WriteLine($"姓名:{student.Name},年龄:{student.Age}");
}
}
}三种方案对比
不同方案的适用场景如下:
| 方案 | 优点 | 适用场景 |
|---|---|---|
| XmlDocument | 节点操作灵活,兼容老版本.NET | 需要频繁修改XML节点结构,或者维护老项目 |
| XmlSerializer | 强类型,开发效率高,无需手动操作节点 | XML结构与固定实体类对应,需要快速实现序列化反序列化 |
| LINQ to XML | 语法简洁,支持LINQ查询,轻量级 | 新项目开发,需要灵活查询和处理XML数据 |
C#XML读写XmlDocumentXmlSerializerLINQ_to_XML修改时间:2026-06-04 15:02:02