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

煙雲
发布: 2025-12-18 13:38:03
原创
519人浏览过
XmlReader 和 XmlWriter 是 .NET 中轻量、高性能的流式 XML 处理类,基于“拉”和“推”模型,支持只读前向遍历与顺序写入,适用于大文件处理;二者可配合实现边读边写的流式转换。

c#的xmlreader和xmlwriter怎么实现流式读写

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

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

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

  • XmlReader.Create() 创建实例,支持从 Stream、TextReader、Uri 或字符串输入
  • 调用 Read() 移动到下一个节点,返回 bool 表示是否还有节点
  • 通过 NodeType 判断当前节点类型(Element、Text、EndElement 等)
  • NameValueGetAttribute() 获取内容和属性

示例:读取 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 规则生成节点流,会自动处理缩进、转义、命名空间和格式合法性(如匹配起始/结束标签)。

  • XmlWriter.Create() 创建,可传入 StreamWriter、Stream 或 StringBuilder
  • WriteStartElement() / WriteEndElement() 写元素;WriteValue() 写文本内容
  • WriteAttributeString() 写属性;WriteComment()WriteProcessingInstruction() 写注释和 PI
  • 必须显式调用 Flush()Close() 确保内容写出

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

Playground AI
Playground AI

AI图片生成和修图

Playground AI 108
查看详情 Playground AI
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(); // 自动补全并关闭
登录后复制

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

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

  • 例如:把所有 元素值乘以 1.1,其余结构不变
  • 读取时判断 NodeType 和 Name;遇到目标元素,读 Value → 计算 → 用 XmlWriter 写新值
  • 注意:XmlWriter 必须严格按 XML 层级写入(Start/End 匹配),不能跳着写

关键逻辑片段:

using var reader = XmlReader.Create("in.xml");
using var writer = XmlWriter.Create("out.xml", new XmlWriterSettings { Indent = true });
<p>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等)可选择性复制
}
}
登录后复制

注意事项与技巧

  • XmlReader 默认不解析 DTD,如需验证或实体展开,需配置 XmlReaderSettings.DtdProcessing = DtdProcessing.Parse
  • 避免在 Read() 后反复调用 Value/Name —— 它们只对当前节点有效,下一次 Read() 就变了
  • XmlWriter 不允许写非法字符(如控制字符),会抛 XmlException;可用 XmlConvert.VerifyXmlChars() 预检
  • 如需异步支持,.NET 6+ 提供 XmlReader.CreateAsync()XmlWriter.CreateAsync()(配合 Stream 的异步 API)

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

以上就是C#的XmlReader和XmlWriter怎么实现流式读写的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号