在 Rust 中处理 XML:解析、创建与序列化数据

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Rust 中处理 XML:库与工具



XML(可扩展标记语言)仍然是数据交换、配置文件及文档处理的关键格式之一。Rust 生态系统提供了多个成熟的 XML 处理方案——从高性能的流式解析到通过 serde 实现的便捷序列化。本文将介绍三种最流行的工具:quick-xml、roxmltree 和 serde-xml-rs。



为什么选择 Rust 处理 XML?



Rust 兼具 C/C++ 的速度与内存安全性。在处理大型 XML 文件(例如医疗记录或地理数据)时,这一点至关重要。Rust 中的 XML 库完全使用 Rust 编写(无 C 绑定),从而保证了线程安全与可预测的性能。



Rust 中的 XML 处理库



  • quick-xml — 高性能流式解析器(SAX 风格)与写入器。内存占用极低,非常适合大型文件。
  • roxmltree — DOM 解析器,构建文档树。便于导航与修改。
  • serde-xml-rs — 通过 serde crate 实现 Rust 结构体与 XML 之间的序列化/反序列化。与类型系统高度集成。


安装



在 Cargo.toml 中添加依赖:



[dependencies]quick-xml = "0.36"        # 流式解析器roxmltree = "0.20"        # DOM 解析器serde-xml-rs = "0.6"      # 序列化(与 serde 配合使用)serde = { version = "1.0", features = ["derive"] }


使用 quick-xml 解析 XML



quick-xml 以 Reader 模式工作——顺序读取令牌(开始标签、文本、结束标签)。这样可以节省内存:您可以逐部分处理文档,而无需将其全部加载到内存中。



示例:读取 RSS 源



use quick_xml::Reader;use quick_xml::events::Event;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <rss version="2.0"> <channel> <title>Rust 新闻</title> <item> <title>Rust 1.78 发布</title> <link>https://example.com/rust-1.78</link> </item> </channel> </rss>"#;

let mut reader = Reader::from_str(xml); reader.trim_text(true);

let mut buf = Vec::new(); let mut in_item = false;

loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"item" { in_item = true; } } Ok(Event::Text(ref e)) => { if in_item { let text = e.unescape()?; println!("{}", text); } } Ok(Event::End(ref e)) => { if e.name().as_ref() == b"item" { in_item = false; } } Ok(Event::Eof) => break, Err(e) => eprintln!("错误: {}", e), _ => () } buf.clear(); } Ok(())}


输出:所有 <item> 的标题。



使用 roxmltree 进行 DOM 解析



roxmltree 将整个 XML 加载到树结构中。当需要多次访问不同节点或修改结构时,这非常方便。



示例:提取属性和文本



use roxmltree::Document;

fn main() { let data = r#" <config version="1.0"> <database> <host>localhost</host> <port>5432</port> </database> </config>"#;

推荐