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

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

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

开始课程

在 Rust 中处理 XML:库概述与实践示例



Rust 是一种现代系统编程语言,越来越多地被用于创建高负载的 Web 服务、命令行工具和嵌入式系统。在处理数据时,经常需要处理 XML 文档。与 Python 的标准库 xml.etree.ElementTree 覆盖大多数任务不同,Rust 生态系统提供了几种具有不同方法的专用 crate。在本文中,我们将介绍三个最流行的用于在 Rust 中处理 XML 的工具:roxmltree、quick-xml 和 serde-xml-rs。



1. roxmltree — 快速且安全的只读解析器



roxmltree 是一个专门用于读取 XML 的 crate。它不支持修改或创建文档,但提供了一个非常快速且可靠的解析器,完全支持命名空间。主要优势在于使用零拷贝数据,从而最大限度地减少内存分配。



// cargo add roxmltreeuse roxmltree::Document;

fn main() -> Result<(), roxmltree::Error> { let xml = r#" <root> <item id="1">第一个元素</item> <item id="2">第二个元素</item> </root>"#;

let doc = Document::parse(xml)?;

// 获取根元素 let root = doc.root_element(); println!("根元素: {}", root.tag_name().name());

// 查找所有 <item> 子元素 for item in root.children().filter(|n| n.has_tag_name("item")) { let id = item.attribute("id").unwrap_or("unknown"); let text = item.text().unwrap_or(""); println!("ID: {}, 文本: {}", id, text); }

Ok(())}


何时使用:如果您只需要读取 XML 文件(配置、API 响应、RSS 源)并且注重最大性能。roxmltree 非常适合一次性解析。



2. quick-xml — 支持读写功能的通用解析器



quick-xml 是 Rust 中最流行的用于处理 XML 的 crate。它既支持解析(事件驱动和类似 DOM 的方式),也支持 XML 序列化(写入)。它既可以处理流(Reader),也可以处理完整字符串。支持属性、CDATA、注释和转义序列。



// cargo add quick-xmluse quick_xml::Reader;use quick_xml::events::Event;

fn main() -> Result<(), quick_xml::Error> { let xml = r#"<library> <book genre="rust">Rust 编程</book> <book genre="python">Python 入门</book></library>"#;

let mut reader = Reader::from_str(xml); reader.trim_text(true); let mut txt = String::new(); let mut current_genre = String::new();

loop { match reader.read_event_into(&mut txt) { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"book" { // 获取 genre 属性 if let Some(attr) = e.attributes().flatten().find(|a| a.key.as_ref() == b"genre") { current_genre = String::from_utf8_lossy(&attr.value).to_string(); } } } Ok(Event::Text(ref e)) => { let text = e.unescape()?; println!("类型: {}, 书名: {}", current_genre, text); } Ok(Event::Eof) => break, Err(e) => panic!("错误: {:?}", e), _ => {} } txt.clear(); } Ok(())}


何时使用:如果您需要灵活性——流式读取大文件、创建新的 XML 文档或

推荐