在.NET开发中,处理XML文件是非常普遍的需求,框架提供了多套成熟的API来满足不同场景下的XML操作要求,开发者可以根据实际需求和文件特点选择合适的方案。

常用XML操作方案对比
首先我们先了解几种主流的.NET XML操作方案的特点,方便后续选择:
| 方案名称 | 核心类 | 适用场景 | 特点 |
|---|---|---|---|
| DOM模型操作 | XmlDocument | 小体积XML文件,需要随机访问节点 | 将整个XML加载到内存,操作直观,支持节点增删改查 |
| Linq to XML | XDocument、XElement | 中等体积XML,需要简洁的查询和操作语法 | 语法更简洁,支持Linq查询,代码可读性高 |
| 流式读取 | XmlReader | 大体积XML文件,不需要修改内容 | 逐节点读取,内存占用极低,只能读取不能修改 |
使用XmlDocument操作XML
XmlDocument是基于DOM模型的经典XML操作类,适合处理结构不复杂的小文件,下面是创建、读取、修改XML的完整示例。
创建XML文件
使用XmlDocument创建包含学生信息的XML文件:
using System.Xml;
class XmlDocumentDemo
{
static void CreateXml()
{
// 创建XmlDocument实例
XmlDocument doc = new XmlDocument();
// 创建XML声明
XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(declaration);
// 创建根节点
XmlElement root = doc.CreateElement("Students");
doc.AppendChild(root);
// 创建第一个学生节点
XmlElement student1 = doc.CreateElement("Student");
// 添加id属性
student1.SetAttribute("Id", "1");
// 添加子节点
XmlElement name1 = doc.CreateElement("Name");
name1.InnerText = "张三";
student1.AppendChild(name1);
XmlElement age1 = doc.CreateElement("Age");
age1.InnerText = "20";
student1.AppendChild(age1);
root.AppendChild(student1);
// 创建第二个学生节点
XmlElement student2 = doc.CreateElement("Student");
student2.SetAttribute("Id", "2");
XmlElement name2 = doc.CreateElement("Name");
name2.InnerText = "李四";
student2.AppendChild(name2);
XmlElement age2 = doc.CreateElement("Age");
age2.InnerText = "21";
student2.AppendChild(age2);
root.AppendChild(student2);
// 保存文件
doc.Save("students.xml");
}
}
读取和修改XML
读取上面创建的XML文件,并修改第一个学生的年龄:
using System.Xml;
class XmlDocumentDemo
{
static void ReadAndUpdateXml()
{
XmlDocument doc = new XmlDocument();
// 加载XML文件
doc.Load("students.xml");
// 获取根节点
XmlNode root = doc.DocumentElement;
// 获取第一个Student节点
XmlNode firstStudent = root.SelectSingleNode("Student[@Id='1']");
if (firstStudent != null)
{
// 获取Age子节点
XmlNode ageNode = firstStudent.SelectSingleNode("Age");
if (ageNode != null)
{
// 修改年龄
ageNode.InnerText = "22";
}
}
// 保存修改
doc.Save("students.xml");
// 读取所有学生信息
XmlNodeList students = root.SelectNodes("Student");
foreach (XmlNode student in students)
{
string id = student.Attributes["Id"].Value;
string name = student.SelectSingleNode("Name").InnerText;
string age = student.SelectSingleNode("Age").InnerText;
Console.WriteLine($"学生ID:{id},姓名:{name},年龄:{age}");
}
}
}
使用Linq to XML操作XML
Linq to XML是.NET后来推出的更简洁的XML操作方案,语法更符合现代C#开发习惯,支持Linq查询,下面是对应示例。
创建XML文件
using System.Xml.Linq;
class LinqToXmlDemo
{
static void CreateXml()
{
// 直接构建XML结构
XDocument doc = new XDocument(
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", "21")
)
)
);
// 保存文件
doc.Save("students_linq.xml");
}
}
查询和修改XML
using System.Xml.Linq;
using System.Linq;
class LinqToXmlDemo
{
static void QueryAndUpdateXml()
{
// 加载XML文件
XDocument doc = XDocument.Load("students_linq.xml");
// 使用Linq查询年龄大于20的学生
var olderStudents = doc.Descendants("Student")
.Where(s => int.Parse(s.Element("Age").Value) > 20)
.Select(s => new
{
Id = s.Attribute("Id").Value,
Name = s.Element("Name").Value,
Age = s.Element("Age").Value
});
Console.WriteLine("年龄大于20的学生:");
foreach (var student in olderStudents)
{
Console.WriteLine($"ID:{student.Id},姓名:{student.Name},年龄:{student.Age}");
}
// 修改ID为1的学生年龄
XElement targetStudent = doc.Descendants("Student")
.FirstOrDefault(s => s.Attribute("Id").Value == "1");
if (targetStudent != null)
{
targetStudent.Element("Age").Value = "22";
}
doc.Save("students_linq.xml");
}
}
使用XmlReader读取大XML文件
如果XML文件体积很大,使用XmlDocument或XDocument会把整个文件加载到内存,可能导致内存溢出,这时候可以使用XmlReader逐节点读取。
using System.Xml;
class XmlReaderDemo
{
static void ReadLargeXml()
{
// 创建XmlReader实例
using (XmlReader reader = XmlReader.Create("large_students.xml"))
{
while (reader.Read())
{
// 判断当前节点是学生节点开始标签
if (reader.NodeType == XmlNodeType.Element && reader.Name == "Student")
{
string id = reader.GetAttribute("Id");
string name = "";
string age = "";
// 读取学生节点的子节点
while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "Student"))
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "Name")
{
name = reader.ReadElementContentAsString();
}
else if (reader.Name == "Age")
{
age = reader.ReadElementContentAsString();
}
}
}
Console.WriteLine($"学生ID:{id},姓名:{name},年龄:{age}");
}
}
}
}
}
操作注意事项
- 操作XML文件时要注意文件路径的正确性,避免文件不存在导致的异常
- 使用XmlReader时只能读取不能修改,如果需要修改大文件,可以结合XmlWriter实现边读边写
- 处理XML内容时要注意特殊字符的转义,比如<、>、&等字符需要正确转义,否则会导致XML格式错误
- 如果XML文件包含命名空间,操作节点时需要带上对应的命名空间,否则可能无法匹配到节点
.NETXML操作XmlDocumentLinq_to_XMLXmlReader修改时间:2026-06-29 22:15:41