nom-xml 0.3.0

A Rust Crate for parsing XML.
Documentation
use std::fs::File;

use nom_xml::{
    attribute::{Attribute, AttributeValue},
    io::read_file,
    tag::Tag,
    Document, DocumentIteratorExt, UpdateFields,
};
use nom_xml_derive::ExtractFields;

#[derive(Clone, Debug, Default, ExtractFields, PartialEq)]
struct VecTests {
    unsigned8: Vec<u8>,
    unsigned16: Vec<u16>,
    #[extract(from_tag = "unsigned32swap")]
    unsigned32: Vec<u32>,
    unsigned64: Vec<u64>,
    unsigned128: Vec<u128>,
    signed8: Vec<i8>,
    signed16: Vec<i16>,
    signed32: Vec<i32>,
    signed64: Vec<i64>,
    signed128: Vec<i128>,
    float32: Vec<f32>,
    float64: Vec<f64>,
    string: Vec<String>,
    #[extract(from_tag = "string2swap")]
    string2: Vec<String>,
}

fn run() -> Result<VecTests, Box<dyn std::error::Error>> {
    let mut file = File::open("tests/derived_tests/data/vec_test.xml")?;
    let data = read_file(&mut file)?;
    let (_, doc) = Document::parse_element_by_tag_name(&data, "vectest", &None)?;
    let mut vectest = VecTests::default();

    doc.iter_with_depth(0)
        .filter_map(|element| {
            if let Document::Element(tag, inner_doc, _) = element {
                Some((tag, inner_doc))
            } else {
                None
            }
        })
        .try_for_each(|(tag, inner_doc)| vectest.update_field(tag, inner_doc))
        .map_err(|e| {
            println!("Error updating field: {}", e);
            e
        })?;
    println!("{:#?}", vectest);
    Ok(vectest)
}

#[test]
fn test() -> Result<(), Box<dyn std::error::Error>> {
    let vec_numerical_tests: VecTests = run()?;

    let expected_vec_numerical_tests = VecTests {
        unsigned8: vec![10, 1],
        unsigned16: vec![20, 2],
        unsigned32: vec![30, 3],
        unsigned64: vec![4, 40],
        unsigned128: vec![50, 5],
        signed8: vec![-10, -1],
        signed16: vec![-2, -20],
        signed32: vec![-30, -3],
        signed64: vec![-4, -40],
        signed128: vec![-50, -5],
        float32: vec![1.1, 11.1],
        float64: vec![22.2, 2.2],
        string: vec!["string".to_string(), "another string".to_string()],
        string2: vec!["extracted from string2swap".to_string()],
    };

    assert_eq!(vec_numerical_tests, expected_vec_numerical_tests);

    Ok(())
}