stats/
stats.rs

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}