XmlReader 和 XmlWriter 是 .NET 中面向流式、只进、低内存的 XML 处理 API,适合大文件或高性能场景;不构建 DOM,比 XmlDocument 更快更省内存;XmlReader 逐节点只读解析,XmlWriter 流式写入,需注意禁用验证、复用设置等性能细节。

XmlReader 和 XmlWriter 是 .NET 中面向流式、只进(forward-only)、低内存占用的 XML 处理 API,适合处理大文件或对性能敏感的场景。它们不构建 DOM 树,不缓存整个文档,因此比 XmlDocument 或 XDocument 更快、更省内存。
XmlReader:高效只读解析
XmlReader 是一个抽象类,常用实现是 XmlReader.Create() 返回的实例。它以游标方式逐节点读取,支持验证、命名空间、DTD 等,但不回退、不修改、不随机访问。
- 用 Read() 移动到下一个节点(返回 false 表示结束)
- 用 NodeType 判断当前节点类型(Element、Text、EndElement、Whitespace 等)
- 用 ReadStartElement("name") 快速定位并验证起始标签
- 用 ReadElementContentAsString() 直接读取元素文本内容(跳过子节点和空白)
- 避免反复调用 GetAttribute("attr"),可先用 MoveToFirstAttribute() 遍历属性
示例:读取
using var reader = XmlReader.Create("books.xml");
while (reader.Read()) {
if (reader.NodeType == XmlNodeType.Element && reader.Name == "book") {
string id = reader.GetAttribute("id"); // 读属性
reader.ReadStartElement(); // 进入 book 元素内部
if (reader.Read() && reader.Name == "title" && reader.NodeType == XmlNodeType.Element) {
string title = reader.ReadElementContentAsString(); // 读 内容
Console.WriteLine($"{id}: {title}");
}
}
}XmlWriter:高性能流式写入
XmlWriter 同样是抽象类,通过 XmlWriter.Create() 创建,支持格式化(缩进)、编码、命名空间前缀绑定、写入验证等。默认不自动格式化,需显式配置 XmlWriterSettings。
- 用 WriteStartDocument() 开头(可选),WriteEndDocument() 结尾
- 用 WriteStartElement("name") 写开始标签,WriteEndElement() 写结束标签,WriteFullEndElement() 自闭合
- 用 WriteAttributeString("name", "value") 写属性(自动转义)
- 用 WriteString("text") 写文本内容(自动转义 , &, ", ')
- 避免拼接字符串写 XML,全部走 Write* 方法保证合法性与安全性
示例:生成带命名空间的简单配置
var settings = new XmlWriterSettings {
Indent = true,
Encoding = Encoding.UTF8
};
using var writer = XmlWriter.Create("config.xml", settings);
writer.WriteStartDocument();
writer.WriteStartElement("config", "http://example.com/ns");
writer.WriteAttributeString("version", "2.0");
writer.WriteStartElement("setting");
writer.WriteAttributeString("key", "timeout");
writer.WriteString("30000");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();关键性能提示
真正发挥 XmlReader/Writer 高性能,需注意几个易忽略细节:
- 关闭 DTD 和 Schema 验证:默认可能加载外部 DTD,设 XmlReaderSettings.DtdProcessing = DtdProcessing.Prohibit,ValidationType = ValidationType.None
- 禁用行号/位置信息:设 XmlReaderSettings.XmlResolver = null 和 LineNumbering = false,减少开销
- 复用 XmlWriterSettings 实例:它是不可变的,可安全跨线程共享
- 用 Stream 替代 FileStream 或 String:直接传入 MemoryStream 或网络流,避免中间字符串拷贝
- 避免在循环中新建 Reader/Writer:尽量复用或使用 using 块控制生命周期
何时不用它们
如果需要随机访问、修改、XPath 查询、LINQ to XML 查询,或者 XML 很小(XDocument 或 LINQ to XML 更直观、开发更快。XmlReader/Writer 的优势只在“大、快、稳”三者兼备时才明显——比如日志批量导出、ETL 数据交换、实时消息 XML 解析等场景。











