在 Rust 中处理 XML:quick-xml、roxmltree 和 serde_xml_rs 库

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

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

开始课程

在 Rust 中处理 XML:关键库概述



XML 仍然是配置文件、旧系统数据交换以及存储结构化信息的热门格式。在 Rust 生态系统中,有多个成熟的库可用于处理 XML,每个库都针对特定场景:从高性能流式解析到便捷地反序列化为强类型结构。在本文中,我们将介绍三个主要库:quick-xml、roxmltree 和 serde_xml_rs,并提供实际使用示例。



quick-xml 库:快速流式解析



quick-xml 是 Rust 中处理 XML 最快的库之一。它旨在实现最小的开销和低内存消耗。其工作原理是流式解析。您按顺序读取 XML,处理事件:开始和结束标签、文本、注释。



这种方法非常适合处理大型文件(数百兆字节),在这些文件中,DOM 模型(将整个文档加载到内存中)是不可行的。该库支持 XML 的读取和写入。



示例:使用 quick-xml 读取配置



假设我们有一个简单的 XML 文件 config.xml:



<config>    <app name="my_app">        <port>8080</port>        <host>localhost</host>    </app></config>


使用 quick-xml 及其高级 API Reader 进行解析:



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

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <config> <app name="my_app"> <port>8080</port> <host>localhost</host> </app> </config> "#;

let mut reader = Reader::from_str(xml); let mut txt = Vec::new(); let mut in_port = false;

loop { match reader.read_event() { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"port" { in_port = true; } } Ok(Event::Text(ref e)) => { if in_port { txt.push(e.unescape()?.to_string()); in_port = false; } } Ok(Event::Eof) => break, Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e), _ => () } } println!("Port value: {}", txt[0]); Ok(())}


如您所见,代码是命令式的,需要手动管理状态,但它提供了对解析过程的完全控制。



roxmltree 库:使用 DOM 树



如果您更喜欢将 XML 作为对象树(DOM)来处理,那么 roxmltree 是一个很好的选择。它将整个文档加载到内存中,并提供便捷的导航方法:通过类似 XPath 的查询进行搜索、遍历子节点、获取属性。



该库不支持序列化(写入 XML),但对于读取和分析来说非常方便。一个重要的优点是严格的命名空间检查。



示例:使用 roxmltree 查找元素



use roxmltree::Document;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <catalog> <book id="1"> <title>Rust in Action</title> <author>Tim McNamara</author> </book> <book id="2"> <title>Programming Rust</title> <author>Jim Blandy</author> </book> </catalog> "#;

let doc = Document::parse(x

推荐