怎么用Rust语言解析XML quick-xml库教程


quick-xml是Rust中解析XML最常用、性能最佳且文档最全的库,支持流式(Reader)和serde反序列化两种方式;需在Cargo.toml中添加quick-xml = { version = "0.35", features = ["encoding"] }以支持非UTF-8编码。

怎么用rust语言解析xml quick-xml库教程

用 Rust 解析 XML,quick-xml 是目前最常用、性能最好、文档较全的库。它支持流式(Reader)和树状(events + BytesStart 等)两种解析方式,兼顾内存效率和开发便利性。

安装 quick-xml 依赖

Cargo.toml 中添加:

[dependencies]
quick-xml = { version = "0.35", features = ["encoding"] }

注意:加 features = ["encoding"] 才能正确处理 UTF-8 以外的编码(如 GBK,不过实际中建议 XML 文件统一用 UTF-8)。

基础流式解析:读取元素和文本

适合大文件或只需提取部分字段的场景,不加载整个 XML 到内存。

示例 XML(book.xml):

<library>
  <book id="1">
    <title>Rust编程入门</title>
    <author>张三</author>
  </book>
  <book id="2">
    <title>XML精讲</title>
    <author>李四</author>
  </book>
</library>

Reader 逐事件解析:

use quick_xml::events::BytesStart;
use quick_xml::Reader;

fn main() -> Result<(), Box<std::error::Error>> {
    let xml = r#"
        <library>
          <book id="1">
            <title>Rust编程入门</title>
            <author>张三</author>
          </book>
        </library>"#;

    let mut reader = Reader::from_reader(xml.as_bytes());
    reader.trim_text(true); // 自动忽略纯空白文本节点

    let mut buf = Vec::new();
    let mut books = Vec::new();

    loop {
        match reader.read_event_into(&mut buf) {
            Ok(quick_xml::events::BytesEvent::Start(e)) => {
                if e.name().as_ref() == b"book" {
                    let id = e.attributes()
                        .find(|a| a.key.as_ref() == b"id")
                        .map(|a| std::str::from_utf8(&a.value).unwrap_or("").to_string());
                    books.push((id, String::new(), String::new()));
                }
            }
            Ok(quick_xml::events::BytesEvent::Text(e)) => {
                let text = e.unescape_and_decode(&reader)?; // 安全解码实体(& → &)
                if let Some(last) = books.last_mut() {
                    // 简单逻辑:紧接在 title/author 开始标签后的文本即为内容
                    // 实际中建议用状态机或栈记录当前路径
                }
            }
            Ok(quick_xml::events::BytesEvent::Eof) => break,
            Err(e) => return Err(e.into()),
            _ => {}
        }
        buf.clear();
    }

    Ok(())
}

⚠️ 流式解析需手动维护上下文(比如当前在哪个标签内),适合结构简单或性能敏感场景。

Notion Sites Notion Sites

Notion 推出的AI网站构建工具,允许用户将 Notion 页面直接发布为完整网站。

Notion Sites 246 查看详情 Notion Sites

更推荐:用 events + 辅助类型提取结构化数据

不用自己写状态机,借助 BytesStartBytesTextReader::read_element 可清晰提取嵌套结构。

例如,定义一个结构体并从 XML 构建它:

use quick_xml::de::from_str;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Debug)]
struct Book {
    #[serde(rename = "@id")]
    id: String,
    title: String,
    author: String,
}

#[derive(Deserialize, Debug)]
struct Library {
    #[serde(rename = "$value")]
    books: Vec<Book>,
}

// 注意:quick-xml 的 serde 支持要求 XML 标签名与字段名匹配(或用 rename)
// 且需确保 XML 是形如 <library><book>...</book></library> 这样扁平嵌套

然后直接反序列化:

let data = r#"
<library>
  <book id="1">
    <title>Rust编程入门</title>
    <author>张三</author>
  </book>
</library>"#;

let library: Library = from_str(data).map_err(|e| e.to_string())?;
println!("{:#?}", library);

✅ 前提是开启 quick-xmlserialize feature(已在 0.35+ 默认启用),并引入 serdeserde_derive

常见问题与技巧

  • 中文乱码? 确保 XML 声明里写了 <?xml version="1.0" encoding="UTF-8"?>,且文件本身是 UTF-8 编码;Rust 字符串默认 UTF-8,无需额外转码
  • 解析失败报 “invalid UTF-8”? 检查是否误把二进制数据(如 ZIP 内的 XML)当纯文本传入;用 std::fs::read 而非 read_to_string 读取原始字节再交给 Reader::from_reader
  • 想跳过某个标签?reader.read_to_end(name)? 快速消耗掉整段(含子节点)
  • 需要修改后再输出 XML?Writer 类型,配合 BytesStart / BytesText 构造事件写回

基本上就这些。quick-xml 上手不难,关键在于分清“流式遍历”和“结构反序列化”两种模式的适用场景——小文件、结构固定,优先用 serde;大文件、只取几个字段,用 Reader + 事件循环。

以上就是怎么用Rust语言解析XML quick-xml库教程的详细内容,更多请关注其它相关文章!


# 编码  # 天津专业的营销推广  # 汝南百度推广营销招聘网  # 财经网站推广方案怎么写  # 网站建设电话销售模板  # 淘宝怎么开通seo  # 海南营销型网站排名优化  # seo追词神速版  # 几个  # 构建一个  # 大文件  # 最常用  # 如何处理  # 序列化  # 两种  # 流式  # 高性能  # 自定义  # 常见问题  # ai  #   # 中文乱码  # 字节  # go  # 鹤山360seo  # 黄冈白酒网站推广价格  # 成都企业网站建设开发 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 风车动漫官网首页入口登录 风车动漫在线观看正版地址  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  iCloud官方网站 iCloud网页版在线登录入口  使用VS Code作为你的个人知识管理系统  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  行者app怎样导出日志  招商淘客入门指南  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  《搜书吧》阅读书籍方法  抖音火山版如何进行提现  在Django中动态检查模型关联:一种灵活的解决方案  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  小红书网页版怎么进 小红书网页版通用入口  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  《伊瑟》凶影追缉库卢鲁boss攻略  《360浏览器》设置摄像头权限方法  驱动人生:游戏修复指南  Dagster资产间数据传递与用户配置管理教程  微信如何设置字体大小_微信字体设置的阅读舒适  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  德邦物流在线查询系统 德邦快递货物运输追踪  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  《咸鱼之王》新版孙坚技能解析  教资成绩怎么查询  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  C++ static关键字作用_C++静态成员变量与静态函数  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  C++ switch case字符串_C++如何实现字符串switch匹配  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  一点万象签到领积分指南  附近酒吧怎么找?  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  构建可配置的J*aScript加权点击计数器与共享总计功能  实现可重用自定义Python Range类  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  J*aScript调试技巧_性能分析与内存快照  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  精通VS Code多光标编辑以实现闪电般快速的修改  重返未来:1999卡戎全方位攻略 

 2025-12-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.