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 68 69 70 71 72
//! A tree-like parser to read, modify and write XML files.
//!
//! It was especially designed for modifying xml files without rigid structure.
//!
//! Parsing from various encodings are supported, including UTF-16, ISO 8859-1, GBK and EUC-KR. (With the notable exception of UTF-32)
//!
//! The XML document is represented with [`Document`], [`Element`] and [`Node`].
//!
//!
//! # Example
//! ```
//! use xml_doc::{Document, Element, Node};
//!
//! const data: &'static str = r#"<?xml version="1.0" encoding="utf-8"?>
//! <metadata>
//! <title>The Felloship of the Ring</title>
//! <author>J. R. R. Tolkien</author>
//! <date>1954</date>
//! </metadata>
//! "#;
//!
//! let mut doc = Document::parse_str(data).unwrap();
//! let metadata = doc.root_element().unwrap();
//!
//! // Add a new element
//! let series = Element::build(&mut doc, "series")
//! .text_content("Lord of the Rings")
//! .push_to(metadata);
//!
//! // Modify existing element
//! let date = metadata.find(&doc, "date").unwrap();
//! date.set_text_content(&mut doc, "29 July 1954");
//!
//! let xml = doc.write_str();
//! ```
//!
//! Below example goes through the root element's children and removes all nodes that isn't `<conf>...</conf>`
//! ```no_run
//! use std::path::Path;
//! use xml_doc::{Document, Node};
//!
//! let xml_file = Path::new("config.xml");
//! let mut doc = Document::parse_file(&xml_file).unwrap();
//! let root = doc.root_element().unwrap();
//! let to_remove: Vec<usize> = root.children(&doc)
//! .iter()
//! .enumerate()
//! .filter_map(|(i, node)| {
//! if let Node::Element(elem) = node {
//! if elem.name(&doc) == "conf" {
//! return None
//! }
//! }
//! Some(i)
//! })
//! .collect();
//! for i in to_remove.iter().rev() {
//! root.remove_child(&mut doc, *i);
//! }
//! doc.write_file(&xml_file);
//! ```
//!
mod document;
mod element;
mod error;
mod parser;
pub use crate::document::{Document, Node, WriteOptions};
pub use crate::element::{Element, ElementBuilder};
pub use crate::error::{Error, Result};
pub use crate::parser::{normalize_space, ReadOptions};