1use quick_xml::events::Event;
2
3pub struct XmlParser;
4
5impl XmlParser {
6 pub fn extract_text<R: std::io::BufRead>(
7 reader: &mut quick_xml::Reader<R>,
8 buf: &mut Vec<u8>,
9 ) -> Result<Option<String>, Box<dyn std::error::Error>> {
10 let mut text = String::new();
11
12 loop {
13 match reader.read_event_into(buf) {
14 Ok(Event::Text(e)) => {
15 text = e.unescape()?.into_owned();
16 text = text.trim().to_string();
17 if !text.is_empty() {
18 break;
19 }
20 }
21 Ok(Event::End(_)) => break,
22 Ok(Event::Eof) => break,
23 Err(e) => return Err(e.into()),
24 _ => {}
25 }
26 buf.clear();
27 }
28
29 Ok(if text.is_empty() { None } else { Some(text) })
30 }
31}