gpt4 book ai didi

rust - 如何在Rust中将单个行的Vec 解析为XML?

转载 作者:行者123 更新时间:2023-12-03 11:36:56 25 4
gpt4 key购买 nike

我正在编写一个Rust命令行程序来grep日志文件。它逐行读取输入文件,并创建包含“基本”日志行(带有时间戳,日志记录级别,线程名称,类名等)和“额外”日志行(包含嵌入式XML或JSON消息)的记录。这是一个简化的示例:

(preceding line)
[2020-10-02 12:00:00,000Z][INFO][input-io][XMLReader] Received XML message:
<?xml version="1.0"?>
<Outer foo="bar"><Inner baz="qux"/></Outer>
(following line)
我已经到了要打印一条记录的嵌入式XML消息的地步。我需要做的是获取“额外”日志行(存储在 Vec<String>中),并将它们传递到XML Pull阅读器库之一(我目前正在研究 quick_xml,因为它在基准测试中表现良好,但是我会使用如有必要,可以选择另一种)。
我的问题是,quick_xml Reader类期望 BufRead实现,但是我不知道如何从 Vec<String>创建它。谁能提供任何建议?
或者,某些其他语言的XML Pull阅读器库支持以任意块的形式输入文本。有没有这样做的XML库?

最佳答案

您可以使用 Vec::join 将所有行合并为一个:

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

fn main() {
let vec_of_string = vec![
"<?xml version=\"1.0\"?>".to_owned(),
"<Outer foo=\"bar\">".to_owned(),
"<Inner baz=\"qux\"/>".to_owned(),
"</Outer>".to_owned(),
];

// HERE WE GO
let xml = vec_of_string.join("\n");

// copy-paste from quick_xml's documentation
let mut reader = Reader::from_str(&xml);
let mut buf = Vec::new();
loop {
match reader.read_event(&mut buf) {
Ok(Event::Start(ref e)) => {
println!(
"name:{:?} attributes values:{:?}",
e.name(),
e.attributes()
.map(|a| a.unwrap().value)
.collect::<Vec<_>>()
);
},
Ok(Event::Eof) => break,
Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e),
_ => (),
}

buf.clear();
}
}

关于rust - 如何在Rust中将单个行的Vec <String>解析为XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64175709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com