新闻中心

C# 如何从一个大的xml流中分块读取数据

2025-10-31
浏览次数:
返回列表
使用XmlReader流式读取大XML文件可避免内存溢出,通过ReadSubtree()逐个处理Order节点,结合XmlSerializer反序列化为对象,实现高效低耗的数据提取与处理。

c# 如何从一个大的xml流中分块读取数据

在处理大型 XML 文件时,直接加载整个文档到内存中会导致性能问题甚至内存溢出。C# 提供了 XmlReader 类,支持以流式方式高效读取大 XML 文件,无需一次性加载全部内容。通过分块读取特定节点,可以有效控制内存使用。

使用 XmlReader 流式读取 XML 数据块

XmlReader 采用只进、只读的方式解析 XML,非常适合处理大文件。你可以按需提取某个父节点下的数据块,逐个处理。

示例:从一个包含多个 Order 节点的大 XML 文件中分块读取

假设 XML 结构如下:

<Orders>
  <Order Id="1">
    <Item>Apple</Item>
    <Qty>10</Qty>
  </Order>
  <Order Id="2">
    <Item>Banana</Item>
    <Qty>5</Qty>
  </Order>
  ...
</Orders>

使用以下代码逐个读取每个 Order 节点:

using (var reader = XmlReader.Create("large.xml"))
{
    while (reader.Read())
    {
        if (reader.IsStartElement("Order"))
        {
            // 读取当前节点的完整子树
            using (var subtree = reader.ReadSubtree())
            {
                var orderDoc = new XmlDocument();
                orderDoc.Load(subtree);
                // 处理单个 Order 节点(例如序列化、转换或保存)
                ProcessOrder(orderDoc.DocumentElement);
            }
        }
    }
}

关键点:

  • ReadSubtree():捕获当前节点及其所有子节点,生成独立的可读子流。
  • 每次只加载一个 Order 节点,内存占用恒定。
  • XmlDocument 仅用于处理当前块,可替换为更轻量的对象映射(如反序列化到类)。

跳过不关心的数据以提升性能

XmlReader 允许快速跳过不需要的节点,避免不必要的解析开销。

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho

如果只想读取特定条件的节点(如 Id > 100),可在判断后调用 reader.Skip() 跳过整个节点树。

if (reader.IsStartElement("Order"))
{
    string id = reader["Id"];
    if (int.TryParse(id, out int orderId) && orderId <= 100)
    {
        reader.Skip(); // 直接跳过该节点
    }
    else
    {
        using (var subtree = reader.ReadSubtree())
        {
            // 只处理符合条件的节点
        }
    }
}

结合流式反序列化提高效率

如果你的数据结构固定,可定义对应的 C# 类,并使用 XmlSerializer 直接反序列化子树。

public class Order
{
    [XmlAttribute("Id")]
    public int Id { get; set; }
    public string Item { get; set; }
    public int Qty { get; set; }
}

在读取时直接反序列化:

if (reader.IsStartElement("Order"))
{
    var serializer = new XmlSerializer(typeof(Order));
    var order = (Order)serializer.Deserialize(reader);
    ProcessOrder(order); // 处理对象
}

这种方式更简洁,且避免创建 XmlDocument 对象,进一步降低开销。

基本上就这些。使用 XmlReader 配合 ReadSubtree 或反序列化,能高效地从大 XML 流中分块提取数据,保持低内存占用和良好性能。

以上就是C# 如何从一个大的xml流中分块读取数据的详细内容,更多请关注其它相关文章!


# 重试  # 兰州快速关键词排名方法  # 外贸优化对网站有要求么  # 陕西关键词排名前十  # 网站设计与建设外包  # 苏州个人网站建设是什么  # 蝴蝶网站建设路  # 宁国关键词seo  # 邵武提供seo服务费  # 网站创新建设方案  # 侯马网站推广公司  # 分片  # 客户端  # c#  # 加载  # 流式  # 数据结构  # 多线程  # 跳过  # 序列化  # 子树  # 内存占用  # apple  # app  # xml流 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  J*aScript中向JSON对象添加新属性的正确姿势  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Go语言中JSON数据解码与字段访问指南  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  J*aScript设计模式实践_j*ascript代码优化  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  FullCalendar 自定义按钮样式定制指南  C++如何实现单例模式_C++设计模式之线程安全的单例写法  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  Django表单验证失败时保留用户输入数据的最佳实践  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  利用Bokeh CustomJS动态控制DataTable列可见性  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  12306选座如何查看座位示意图_12306座位示意图解读与使用  解决移动端滚动问题的overflow属性应用指南  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  Python getattr() 异常处理深度解析:避免程序意外退出  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  AO3最新官网入口公告_2025AO3镜像站实时查询方法  深入理解与实现最大堆的Heapify过程:常见错误与修正  电脑IP地址怎么查 查看本机IP地址的几种方法  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  CSS子选择器:如何区分并样式化嵌套列表的子层级  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  R星幕后开发视频泄露 包含《GTA6》等多款大作  美团外卖商家服务中心入口 美团商家版官网入口  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  PySpark中从现有列右侧提取可变长度字符创建新列的教程  Golang如何优雅处理error_Golang error处理最佳实践总结  基于动态规划的房屋花卉种植最小成本算法详解  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南 

搜索