通八洲科技

C#的XmlReader和XmlWriter怎么实现流式读写

日期:2025-12-18 00:00 / 作者:煙雲
XmlReader 和 XmlWriter 是 .NET 中轻量、高性能的流式 XML 处理类,基于“拉”和“推”模型,支持只读前向遍历与顺序写入,适用于大文件处理;二者可配合实现边读边写的流式转换。

XmlReaderXmlWriter 是 .NET 中轻量、高性能的流式 XML 处理类,不加载整个文档到内存,适合处理大文件或对性能敏感的场景。它们基于“推”(Writer)和“拉”(Reader)模型,操作的是 XML 节点流,而非 DOM 树。

XmlReader:只读、前向、单次遍历

XmlReader 是只进、只读的游标式读取器,逐个读取节点(如 StartElement、Text、EndElement),不能回退或随机访问。

示例:读取 C#入门

using var reader = XmlReader.Create("books.xml");
while (reader.Read()) {
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "book") {
        string id = reader.GetAttribute("id"); // "1"
    }
    else if (reader.NodeType == XmlNodeType.Element && reader.Name == "title") {
        reader.Read(); // 移动到 Text 节点
        string title = reader.Value; // "C#入门"
    }
}

XmlWriter:只写、顺序生成、自动格式校验

XmlWriter 是顺序写入器,按 XML 规则生成节点流,会自动处理缩进、转义、命名空间和格式合法性(如匹配起始/结束标签)。

示例:生成一个简单 book 元素

using var writer = XmlWriter.Create("output.xml", 
    new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 });
writer.WriteStartDocument();
writer.WriteStartElement("book");
writer.WriteAttributeString("id", "1");
writer.WriteElementString("title", "C#入门");
writer.WriteEndElement();
writer.WriteEndDocument(); // 自动补全并关闭

配合使用:边读边写(转换/过滤/重排)

典型场景是“流式转换”——不落地加载,直接读一段、加工一段、写一段,内存占用恒定。

关键逻辑片段:

using var reader = XmlReader.Create("in.xml");
using var writer = XmlWriter.Create("out.xml", new XmlWriterSettings { Indent = true });

while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: writer.WriteStartElement(reader.Name); // 复制所有属性 for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); writer.WriteAttributeString(reader.Name, reader.Value); } reader.MoveToElement(); // 回到元素节点 break; case XmlNodeType.Text: if (reader.ParentNode?.Name == "price") { decimal price = decimal.Parse(reader.Value) * 1.1m; writer.WriteString(price.ToString()); } else { writer.WriteString(reader.Value); } break; case XmlNodeType.EndElement: writer.WriteEndElement(); break; // 其他节点类型(注释、PI等)可选择性复制 } }

注意事项与技巧

基本上就这些。流式读写不复杂但容易忽略节点状态和生命周期管理,把握住“单次前向”和“严格嵌套”两个核心,就能稳定高效地处理任意大小的 XML 数据。