use quick_xml::events::Event; use quick_xml::Reader; pub fn pubmed_len(buffer: &[u8]) -> usize { let mut reader = Reader::from_reader(buffer); let mut in_content = 0usize; let mut total = 0usize; loop { match reader.read_event() { Ok(Event::Start(e)) => { if in_content != 0 { in_content += 1; } else { if e.name().as_ref() == b"abstract" || e.name().as_ref()== b"body" { in_content = 1; } } } Ok(Event::End(_)) => { if in_content != 0 { in_content -= 1; } } Ok(Event::Text(e)) => { if in_content != 0 { total += e.len(); } } Ok(Event::Eof) => break, Ok(_) => {} Err(_) => unreachable!("buffer is valid PMC XML"), } } total } pub fn pubmed_len_with_entities(buffer: &[u8]) -> usize { let mut reader = Reader::from_reader(buffer); let mut in_content = 0usize; let mut total = 0usize; loop { match reader.read_event() { Ok(Event::Start(e)) => { if in_content != 0 { in_content += 1; } else if e.name().as_ref() == b"abstract" || e.name().as_ref() == b"body" { in_content = 1; } } Ok(Event::End(_)) => { if in_content != 0 { in_content -= 1; } } Ok(Event::Text(e)) => { if in_content != 0 { total += e.decode().unwrap().len(); } } Ok(Event::Eof) => break, Ok(_) => {} Err(_) => unreachable!("buffer is valid PMC XML"), } } total }