1use std::collections::HashSet;
2
3fn main() {
4 let args: Vec<_> = std::env::args().collect();
5
6 if args.len() != 2 {
7 println!("Usage:\n\tcargo run --example stats -- input.xml");
8 std::process::exit(1);
9 }
10
11 let text = std::fs::read_to_string(&args[1]).unwrap();
12 let opt = roxmltree::ParsingOptions {
13 allow_dtd: true,
14 ..roxmltree::ParsingOptions::default()
15 };
16 let doc = match roxmltree::Document::parse_with_options(&text, opt) {
17 Ok(v) => v,
18 Err(e) => {
19 println!("Error: {}.", e);
20 std::process::exit(1);
21 }
22 };
23
24 println!(
25 "Elements count: {}",
26 doc.root().descendants().filter(|n| n.is_element()).count()
27 );
28
29 let attrs_count: usize = doc.root().descendants().map(|n| n.attributes().len()).sum();
30 println!("Attributes count: {}", attrs_count);
31
32 let ns_count: usize = doc.root().descendants().map(|n| n.namespaces().len()).sum();
33 println!("Namespaces count: {}", ns_count);
34
35 let mut uris = HashSet::new();
36 for node in doc.root().descendants() {
37 for ns in node.namespaces() {
38 uris.insert((
39 ns.name().unwrap_or("\"\"").to_string(),
40 ns.uri().to_string(),
41 ));
42 }
43 }
44 println!("Unique namespaces count: {}", uris.len());
45 if !uris.is_empty() {
46 println!("Unique namespaces:");
47 for (key, value) in uris {
48 println!(" {:?}: {}", key, value);
49 }
50 }
51
52 println!(
53 "Comments count: {}",
54 doc.root().descendants().filter(|n| n.is_comment()).count()
55 );
56
57 println!("Comments:");
58 for node in doc.root().descendants().filter(|n| n.is_comment()) {
59 println!("{:?}", node.text().unwrap());
60 }
61}