docx_reader/reader/
custom_properties.rs1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use super::*;
6
7impl FromXML for CustomProps {
8 fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
9 let mut r = EventReader::new(reader);
10 let mut props = CustomProps::new();
12 loop {
13 let e = r.next();
14 match e {
15 Ok(XmlEvent::StartElement {
16 name, attributes, ..
17 }) => {
18 if let Ok(XMLElement::Property) = XMLElement::from_str(&name.local_name) {
19 if let Some(key) = read_name(&attributes) {
20 loop {
21 let e = r.next();
22 match e {
23 Ok(XmlEvent::StartElement { name, .. }) => {
24 if let Ok(VtXMLElement::Lpwstr) =
26 VtXMLElement::from_str(&name.local_name)
27 {
28 let e = r.next();
29 if let Ok(XmlEvent::Characters(c)) = e {
30 props = props.add_custom_property(&key, c)
31 }
32 }
33 }
34 Ok(XmlEvent::EndElement { name, .. }) => {
35 if let Ok(XMLElement::Property) =
36 XMLElement::from_str(&name.local_name)
37 {
38 break;
39 }
40 }
41 _ => {}
42 }
43 }
44 }
45 }
46 }
47 Ok(XmlEvent::EndDocument { .. }) => {
48 return Ok(props);
49 }
50 Err(_) => return Err(ReaderError::XMLReadError),
51 _ => {}
52 }
53 }
54 }
55}