在 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 — 通过
serdecrate 实现 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>"#;