XmlReader 和 XmlWriter 是 .NET 中面向流式、只进、低内存的 XML 处理 API,适合大文件或高性能场景;不构建 DOM,比 XmlDocument 更快更省内存;XmlReader 逐节点只读解析,XmlWriter 流式写入,需注意禁用验证、复用设置等性能细节。
XmlReader 和 XmlWriter 是 .NET 中面向流式、只进(forward-only)、低内存占用的 XML 处理 API,适合处理大文件或对性能敏感的场景。它们不构建 DOM 树,不缓存整个文档,因此比 XmlDocument 或 XDocument 更快、更省内存。
XmlReader 是一个抽象类,常用实现是 XmlReader.Create() 返回的实例。它以游标方式逐节点读取,支持验证、命名空间、DTD 等,但不回退、不修改、不随机访问。
示例:读取
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.Create() 创建,支持格式化(缩进)、编码、命名空间前缀绑定、写入验证等。默认不自动格式化,需显式配置 XmlWriterSettings。
e") 写属性(自动转义)示例:生成带命名空间的简单配置
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 高性能,需注意几个易忽略细节:
如果需要随机访问、修改、XPath 查询、LINQ to XML 查询,或者 XML 很小(XDocument 或 LINQ to XML 更直观、开发更快。XmlReader/Writer 的优势只在“大、快、稳”三者兼备时才明显——比如日志批量导出、ETL 数据交换、实时消息 XML 解析等场景。