1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
use std::io::Read; use xml::reader::{EventReader, XmlEvent}; use super::*; use crate::reader::{FromXML, ReaderError}; impl FromXML for Rels { fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> { let parser = EventReader::new(reader); let mut s = Self::default(); let mut depth = 0; for e in parser { match e { Ok(XmlEvent::StartElement { attributes, .. }) => { if depth == 1 { let mut id = "".to_owned(); let mut rel_type = "".to_owned(); let mut target = "".to_owned(); for attr in attributes { let name: &str = &attr.name.local_name; if name == "Id" { id = attr.value.clone(); } else if name == "Type" { rel_type = attr.value.clone(); } else if name == "Target" { target = attr.value.clone(); } } s = s.add_rel(id, rel_type, target); } depth += 1; } Ok(XmlEvent::EndElement { .. }) => { depth -= 1; } Err(_) => return Err(ReaderError::XMLReadError), _ => {} } } Ok(s) } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; #[test] fn test_from_xml() { let xml = r#"<?xml version="1.0" encoding="UTF-8"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml" /> </Relationships>"#; let c = Rels::from_xml(xml.as_bytes()).unwrap(); let mut rels = Vec::new(); rels.push(( "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" .to_owned(), "rId1".to_owned(), "docProps/core.xml".to_owned(), )); assert_eq!(Rels { rels }, c); } }