docx_reader/reader/
document.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use crate::reader::*;
6
7use super::{Paragraph, Table};
8
9impl FromXML for Document {
10	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
11		let mut parser = EventReader::new(reader);
12		let mut doc = Self::default();
13		loop {
14			let e = parser.next();
15			match e {
16				Ok(XmlEvent::StartElement {
17					attributes, name, ..
18				}) => {
19					let e = XMLElement::from_str(&name.local_name).unwrap();
20					match e {
21						XMLElement::Paragraph => {
22							let p = Paragraph::read(&mut parser, &attributes)?;
23							doc = doc.add_paragraph(p);
24							continue;
25						}
26						XMLElement::Table => {
27							let t = Table::read(&mut parser, &attributes)?;
28							doc = doc.add_table(t);
29							continue;
30						}
31						XMLElement::SectionProperty => {
32							let e = SectionProperty::read(&mut parser, &attributes)?;
33							doc = doc.default_section_property(e);
34							continue;
35						}
36						XMLElement::StructuredDataTag => {
37							if let Ok(tag) = StructuredDataTag::read(&mut parser, &attributes) {
38								doc = doc.add_structured_data_tag(tag);
39							}
40							continue;
41						}
42						_ => {}
43					}
44				}
45				Ok(XmlEvent::EndDocument) => break,
46				Err(_) => return Err(ReaderError::XMLReadError),
47				_ => {}
48			}
49		}
50		Ok(doc)
51	}
52}