闽公网安备 35020302035485号
[dependencies] quick-xml = "0.36.1"使用quick-xml也是非常简单的:
use quick_xml::{events::Event, Reader};
fn main() {
let xml = r#"<person id="1"><name>Jim</name></person>"#;
let mut reader = Reader::from_str(&xml);
let mut buffer = Vec::new();
// 堆代码 duidaima.com
loop {
match reader.read_event_into(&mut buffer) {
Err(e) => panic!("{:?}" , e),
// 推出解析
Ok(Event::Eof) => break,
Ok(Event::Start(e)) => {
// 解析标签我们可以e.name() 进行匹配,并使用e.attributes()获取所有属性
match e.name().as_ref() {
b"person" => println!("{:?}", e.attributes().map(|a| a).collect::<Vec<_>>()),
b"name" => println!("{:?}", e.attributes().map(|a| a).collect::<Vec<_>>()),
_ => ()
}
},
// 如果事件是文本内容(例如 "Jim")
Ok(Event::Text(text)) => println!("{:?}", String::from_utf8(text.to_vec()).unwrap()),
_ => ()
}
}
println!("{}", String::from_utf8(buffer).unwrap());
}
存在什么问题?use quick_xml::Reader;
use quick_xml::events::Event;
fn main() {
let xml = r#"<root><tag>内容</tag></root>"#;
let mut reader = Reader::from_str(xml);
reader.trim_text(true);
let mut buf = Vec::new();
// 我们需要一个变量来标识你当前的位置Tag位置
let mut in_tag = false;
loop {
match reader.read_event(&mut buf) {
// 如果是我们的tag标签
Ok(Event::Start(ref e)) if e.name() == b"tag" => in_tag = true,
Ok(Event::End(ref e)) if e.name() == b"tag" => {
// 别问了要释放tag标识哦
in_tag = false;
}
Ok(Event::Text(e)) if in_tag => {
// 写入内容
println!("内容: {:?}", e.unescape_and_decode(&reader).unwrap());
}
Ok(Event::Eof) => break,
Err(e) => panic!("Error: {:?}", e),
_ => (),
}
buf.clear();
}
}
> 也有可能是我目前对这个lib不熟,如果有更好的写法。可以评论区回复。
use quick_xml::de::from_str;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct MyStruct {
#[serde(rename = "tag")]
content: String,
}
fn main() {
let xml = r#"<root><tag>内容</tag></root>"#;
let result: MyStruct = from_str(xml).unwrap();
println!("{:?}", result);
}
在本文中,我们探讨了如何使用Rust中的quick-xml库来读取和解析XML文件内容。我们首先介绍了基本的解析流程,包括如何处理标签和文本内容,并讨论了一些可能遇到的挑战。随后,我们展示了如何利用serde库简化解析过程,通过定义结构体来高效地反序列化XML数据。这种方法不仅提高了代码的可读性,还减少了出错的可能性。感谢您的阅读,希望这篇文章对您在Rust开发中处理XML有所帮助。如果您有任何建议或更好的实现方式,请随时分享!