0

0

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

煙雲

煙雲

发布时间:2025-12-18 13:38:03

|

519人浏览过

|

来源于php中文网

原创

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 元素

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用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 });

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 数据。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1897

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2088

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1042

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1492

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

622

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

572

2024.03.22

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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