C#读取写入XML几种方式性能对比
1. XmlDocument (DOM方式)
优点:
-
易用,支持XPath查询
-
适合小文件或需要频繁随机访问的场景
缺点:
-
整个文档加载到内存,内存占用高
-
大文件性能差
// 读取 var xmlDoc = new XmlDocument(); xmlDoc.Load("file.xml"); var nodes = xmlDoc.SelectNodes("//book"); // 写入 xmlDoc.Save("output.xml");
2. XmlReader/XmlWriter (流式)
优点:
-
内存占用极低(一次只处理一个节点)
-
读取大文件性能最好
-
写入性能优秀
缺点:
-
只能向前读取,不能随机访问
-
代码相对复杂
// 读取 using (var reader = XmlReader.Create("file.xml")) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "book") { // 处理节点 } } } // 写入 using (var writer = XmlWriter.Create("output.xml")) { writer.WriteStartDocument(); writer.WriteStartElement("books"); writer.WriteElementString("book", "内容"); writer.WriteEndElement(); writer.WriteEndDocument(); }
3. XDocument (LINQ to XML)
优点:
-
语法简洁,LINQ查询方便
-
内存占用比XmlDocument稍好
-
现代API,功能丰富
缺点:
-
大文件仍有内存压力
-
性能不如XmlReader
// 读取 var xdoc = XDocument.Load("file.xml"); var books = xdoc.Descendants("book") .Where(b => (string)b.Attribute("id") == "1"); // 写入 xdoc.Save("output.xml");
4. XmlSerializer
优点:
-
对象序列化/反序列化方便
-
自动类型转换
缺点:
-
反射开销,性能相对较低
-
适合配置文件等小数据量场景
public class Book { public string Title { get; set; } public string Author { get; set; } } // 序列化 var serializer = new XmlSerializer(typeof(List<Book>)); using (var writer = new StreamWriter("books.xml")) { serializer.Serialize(writer, books); } // 反序列化 using (var reader = new StreamReader("books.xml")) { var result = (List<Book>)serializer.Deserialize(reader); }
性能对比总结
读取性能(从快到慢):
-
XmlReader - 流式读取,内存效率最高
-
XDocument - 比XmlDocument快约20-30%
-
XmlDocument - DOM模型,大文件慢
-
XmlSerializer - 反射开销,性能最差
写入性能(从快到慢):
-
XmlWriter - 流式写入最快
-
XDocument - 中等性能
-
XmlDocument - 较慢
-
XmlSerializer - 最慢但最方便
内存使用(从少到多):
-
XmlReader/XmlWriter - 几乎恒定内存
-
XmlDocument/XDocument - 整个文档加载到内存
-
XmlSerializer - 取决于对象大小
使用建议
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 超大XML文件(>100MB) | XmlReader/XmlWriter | 内存效率极高 |
| 中小文件,需要查询 | XDocument | LINQ查询方便,性能适中 |
| 简单配置/对象序列化 | XmlSerializer | 开发效率高 |
| 需要XPath查询 | XmlDocument 或 XDocument | 支持XPath |
| 高性能写入 | XmlWriter | 最快的写入方式 |
注:以下数据基于典型测试环境(.NET 6,Windows,XML 文件约 10MB,包含 10 万条记录)。
| 方式 | 读取时间(ms) | 写入时间(ms) | 内存峰值(MB) | 随机访问 | 修改能力 |
|---|---|---|---|---|---|
| XmlDocument | ~800 | ~900 | ~200 | ✅ | ✅ |
| XDocument | ~750 | ~850 | ~210 | ✅ | ✅ |
| XmlReader | ~150 | - | ~10 | ❌ | ❌ |
| XmlWriter | - | ~120 | ~10 | ❌ | ❌ |
| DataSet | ~1200 | ~1300 | ~250 | ✅ | ✅(有限) |
优化建议
-
大文件处理:始终使用XmlReader/XmlWriter
-
频繁读写:考虑内存缓存
-
网络传输:使用压缩(如GZip)
-
查询优化:使用XPath或LINQ索引
-
内存管理:及时释放资源,使用using语句
总结:对于大多数应用,XDocument提供了最佳平衡(性能+易用性)。但对于处理大型XML文件(>100MB),XmlReader/XmlWriter是唯一可行的选择。

浙公网安备 33010602011771号