如何解析向量<;字符串>;在Rust中以XML形式显示单个行的数量?

如何解析向量<;字符串>;在Rust中以XML形式显示单个行的数量?,rust,Rust,我正在编写一个Rust命令行程序来处理grep日志文件。它逐行读取输入文件,并创建包含“基本”日志行(带有时间戳、日志级别、线程名称、类名等)和“额外”日志行(包含嵌入的XML或JSON消息)的记录。下面是一个简化的示例: (preceding line) [2020-10-02 12:00:00,000Z][INFO][input-io][XMLReader] Received XML message: <?xml version="1.0"?> <Out

我正在编写一个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)
(前一行)
[2020-10-02 12:00:00000Z][INFO][input io][XMLReader]收到XML消息:
(下一行)
我已经到了尝试为单个记录打印嵌入的XML消息的地步。我需要做的是获取“额外”的日志行(存储在
Vec
)并将它们传递给一个XML拉取读取器库(我目前正在研究,因为它在基准测试中表现良好,但如果需要,我会使用另一个)

我这里的问题是quick_xml
Reader
类需要一个
BufRead
实现,但我不知道如何从
Vec
创建它。有人能提供一些建议吗

或者,其他语言中的一些XML拉读取器库支持以任意块形式提供文本。是否有这样的XML库?

您可以使用它将所有行合并为一行:

使用quick_xml::Reader;
使用quick_xml::events::Event;
fn main(){
让vec\u of_string=vec[
“.to_-owned(),
“.to_-owned(),
“.to_-owned(),
“.to_-owned(),
];
//我们开始
让xml=vec\u of_string.join(“\n”);
//从quick_xml文档复制粘贴
让mut reader=reader::from_str(&xml);
让mut buf=Vec::new();
环路{
匹配读取器。读取事件(&mut buf){
确定(事件::开始(参考e))=>{
普林顿(
“名称:{:?}属性值:{:?}”,
e、 名称(),
e、 属性()
.map(| a | a.unwrap().value)
收集::()
);
},
正常(事件::Eof)=>中断,
Err(e)=>panic!({}:{:?}位置的错误,reader.buffer_position(),e),
_ => (),
}
buf.clear();
}
}
您可以尝试为自己实现字符串的Vec。 然而,您需要克服,因为您不同时拥有Vec类型和BufRead特征

因此,您需要使用包装器类型:

struct BufReadVecWrapper{
//您可以使用引用来分割字符串
//如果你想保留你的vec
字符串:Vec,
}
BufReadVecWrapper的impl BufRead{
//在这里实现所有方法
//基本上,您只需将字符串的字节发送到此处
}
让wrapper=BufReadVecWrapper{strings:your_vec};
让mut reader=quick\u xml::reader::from\u reader(包装器);

您现在可以像中一样使用reader,并避免在将所有字符串合并到一个字符串时进行额外分配。但是,这需要更多的努力。

看起来
join()
调用的结果是自有数据,因此被复制,因为我可以在比原始向量更大的范围内引用它。我希望能够将源数据一次一行地输入pull解析器(无需复制),但如果这是我的选择,我会接受它;谢谢谢谢,值得一试。然而,考虑到我的用例非常有限,并且不需要功能齐全的XML解析器,我决定屈服于傲慢,编写自己的(我还需要一个具有类似需求的JSON解析器)。假设它将定义一个feed()函数,获取一个字符串引用和一个回调特征的impl,那么它应该需要零分配。