在C#开发中,XML作为一种结构化的数据存储格式,常被用于配置文件、数据交换等场景,掌握XML的读写操作是开发者的必备技能。不同的XML操作方式适用于不同的需求,下面逐一介绍常见的实现方案。

使用XmlDocument读取XML文件
XmlDocument是传统的XML操作类,基于DOM模型,适合处理中小型XML文件,操作逻辑清晰,容易理解。
读取XML示例
假设我们有如下结构的XML文件,路径为D:test.xml:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
</user>
</users>
读取该XML文件所有用户信息的代码如下:
using System;
using System.Xml;
class Program
{
static void Main()
{
// 创建XmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// 加载XML文件
xmlDoc.Load(@"D:test.xml");
// 获取根节点
XmlNode root = xmlDoc.SelectSingleNode("users");
// 获取所有user子节点
XmlNodeList userNodes = root.SelectNodes("user");
// 遍历输出用户信息
foreach (XmlNode userNode in userNodes)
{
string id = userNode.Attributes["id"].Value;
string name = userNode.SelectSingleNode("name").InnerText;
string age = userNode.SelectSingleNode("age").InnerText;
Console.WriteLine($"用户ID:{id},姓名:{name},年龄:{age}");
}
}
}
使用XmlDocument写入XML示例
创建一个新的XML文件并写入用户数据的代码如下:
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument xmlDoc = new XmlDocument();
// 创建XML声明
XmlDeclaration declaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(declaration);
// 创建根节点
XmlNode root = xmlDoc.CreateElement("users");
xmlDoc.AppendChild(root);
// 创建第一个user节点
XmlNode user1 = xmlDoc.CreateElement("user");
XmlAttribute idAttr1 = xmlDoc.CreateAttribute("id");
idAttr1.Value = "1";
user1.Attributes.Append(idAttr1);
// 创建name子节点
XmlNode name1 = xmlDoc.CreateElement("name");
name1.InnerText = "张三";
user1.AppendChild(name1);
// 创建age子节点
XmlNode age1 = xmlDoc.CreateElement("age");
age1.InnerText = "25";
user1.AppendChild(age1);
root.AppendChild(user1);
// 保存XML文件
xmlDoc.Save(@"D:new_test.xml");
Console.WriteLine("XML文件写入完成");
}
}
使用Linq to XML读写XML
Linq to XML是.NET Framework 3.5之后推出的更简洁的XML操作方式,代码可读性更强,操作更灵活,是目前推荐的使用方案。
读取XML示例
读取上述D:test.xml文件的代码如下:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 加载XML文件
XDocument xDoc = XDocument.Load(@"D:test.xml");
// 使用Linq查询所有user节点
var users = xDoc.Descendants("user")
.Select(u => new
{
Id = u.Attribute("id").Value,
Name = u.Element("name").Value,
Age = u.Element("age").Value
});
// 输出用户信息
foreach (var user in users)
{
Console.WriteLine($"用户ID:{user.Id},姓名:{user.Name},年龄:{user.Age}");
}
}
}
写入XML示例
使用Linq to XML创建并写入XML文件的代码如下:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 创建XDocument对象
XDocument xDoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("users",
new XElement("user",
new XAttribute("id", "1"),
new XElement("name", "张三"),
new XElement("age", "25")
),
new XElement("user",
new XAttribute("id", "2"),
new XElement("name", "李四"),
new XElement("age", "28")
)
)
);
// 保存文件
xDoc.Save(@"D:linq_test.xml");
Console.WriteLine("Linq to XML写入完成");
}
}
使用StreamReader/StreamWriter读写简单XML
如果XML结构非常简单,也可以直接使用StreamReader读取文本内容,或者StreamWriter写入文本,这种方式适合处理格式固定的小型XML文件。
读取示例
using System;
using System.IO;
class Program
{
static void Main()
{
string xmlPath = @"D:test.xml";
// 使用StreamReader读取全部文本
using (StreamReader reader = new StreamReader(xmlPath))
{
string xmlContent = reader.ReadToEnd();
Console.WriteLine("XML文件内容:");
Console.WriteLine(xmlContent);
}
}
}
写入示例
using System;
using System.IO;
class Program
{
static void Main()
{
string xmlPath = @"D:stream_test.xml";
string xmlContent = "<?xml version="1.0" encoding="utf-8"?>n<users>n <user id="1">n <name>张三</name>n <age>25</age>n </user>n</users>";
// 使用StreamWriter写入内容
using (StreamWriter writer = new StreamWriter(xmlPath))
{
writer.Write(xmlContent);
}
Console.WriteLine("Stream方式写入完成");
}
}
不同方式的适用场景
可以根据实际需求选择合适的XML操作方式:
- XmlDocument:适合需要兼容旧版本.NET框架,或者习惯DOM模型操作的场景,处理中小型XML文件效率尚可。
- Linq to XML:适合.NET Framework 3.5及以上版本的项目,代码简洁,支持Linq查询,处理各种复杂度的XML都很方便,是首选方案。
- StreamReader/StreamWriter:仅适合XML结构极其简单、不需要解析节点内容的场景,灵活度低,不建议用于复杂XML操作。
注意事项
在操作XML文件时需要注意以下几点:
- 读取或写入文件时需要确保文件路径正确,且程序有对应的文件读写权限,避免出现IO异常。
- XML文件编码需要和代码中指定的编码一致,否则可能出现乱码问题,通常推荐使用utf-8编码。
- 使用XmlDocument或Linq to XML操作XML时,如果节点不存在,直接获取属性或子节点会抛出异常,建议先判断节点是否存在再操作。
C#XML读写XmlDocumentLinq_to_XMLStreamReader修改时间:2026-07-19 11:57:39