xml_oxide 0.3.0

XML SAX parser implementation that parses any well-formed XML defined in the W3C Spec
Documentation
use std::fs::File;

use xml_oxide::{sax::parser::Parser, sax::Event};

extern crate xml_oxide;

#[test]
fn newer_parser_1() {
    let f: File = match File::open("tests/xml_files/books.xml") {
        Ok(file) => file,
        Err(e) => {
            println!("{}", e);
            panic!("file error");
        }
    };
    let mut p = Parser::from_reader(f);
    let mut result: String = String::new();
    loop {
        let res = p.read_event();

        match res {
            Ok(event) => match event {
                Event::EndDocument => {
                    println!("{:?}", event);
                    result.push_str(&format!("{:?}\n", event));
                    break;
                }
                _ => {
                    println!("{:?}", event);
                    result.push_str(&format!("{:?}\n", event));
                }
            },
            Err(_err) => {
                break;
            }
        }
    }

    let expected = r#"StartDocument
XmlDeclaration("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
Whitespace("\r\n")
StartElement(StartElement { name: "fp:books", attributes: [Attribute { value: "http://github.com/fatihpense", name: "xmlns:fp", local_name: "fp", prefix: "xmlns", namespace: "" }], is_empty: false, local_name: "books", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n    ")
StartElement(StartElement { name: "fp:book", attributes: [Attribute { value: "true", name: "fp:archive", local_name: "archive", prefix: "fp", namespace: "http://github.com/fatihpense" }, Attribute { value: "true", name: "fp:read", local_name: "read", prefix: "fp", namespace: "http://github.com/fatihpense" }, Attribute { value: "false", name: "fp:gifted", local_name: "gifted", prefix: "fp", namespace: "http://github.com/fatihpense" }], is_empty: false, local_name: "book", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n        ")
StartElement(StartElement { name: "fp:title_english", attributes: [], is_empty: false, local_name: "title_english", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("Madonna in a Fur Coat")
EndElement(EndElement { name: "fp:title_english", local_name: "title_english", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n        ")
StartElement(StartElement { name: "fp:title_original", attributes: [], is_empty: false, local_name: "title_original", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("Kürk Mantolu Madonna")
EndElement(EndElement { name: "fp:title_original", local_name: "title_original", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n        ")
StartElement(StartElement { name: "fp:author", attributes: [], is_empty: false, local_name: "author", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("Sabahattin Ali")
EndElement(EndElement { name: "fp:author", local_name: "author", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n        ")
StartElement(StartElement { name: "fp:quote_english", attributes: [], is_empty: false, local_name: "quote_english", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("It is, perhaps, easier to dismiss a man whose face gives no indication of an inner life. And what a pity that is: a dash of curiosity is all it takes to stumble upon treasures we never expected.")
EndElement(EndElement { name: "fp:quote_english", local_name: "quote_english", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n        ")
StartElement(StartElement { name: "fp:original_language", attributes: [], is_empty: false, local_name: "original_language", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("tr")
EndElement(EndElement { name: "fp:original_language", local_name: "original_language", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n    ")
EndElement(EndElement { name: "fp:book", local_name: "book", prefix: "fp", namespace: "http://github.com/fatihpense" })
Characters("\r\n")
EndElement(EndElement { name: "fp:books", local_name: "books", prefix: "fp", namespace: "http://github.com/fatihpense" })
Whitespace("\r\n")
EndDocument
"#;
    // println!("{}", result);

    //it fails changing the reading chunk size.
    // assert_eq!(result, expected);
}

#[test]
fn newer_parser_commentcdata() {
    let f: File = match File::open("tests/xml_files/comment-cdata.xml") {
        Ok(file) => file,
        Err(e) => {
            println!("{}", e);
            panic!("file error");
        }
    };
    let mut p = Parser::from_reader(f);
    let mut comments: String = String::new();
    let mut cdatas: String = String::new();

    let mut inside_comment = false;
    let mut inside_cdata = false;

    loop {
        let res = p.read_event();
        match res {
            Ok(event) => match event {
                Event::EndDocument => {
                    break;
                }
                Event::StartComment => {
                    inside_comment = true;
                }
                Event::EndComment => {
                    inside_comment = false;
                    comments.push_str(",");
                }
                Event::Characters(_c) => {}
                Event::Comment(c) => {
                    // if inside_comment {
                    comments.push_str(c);
                    // }
                }

                Event::Cdata(d) => {
                    // if inside_cdata {
                    cdatas.push_str(d);

                    // }
                }
                Event::StartCdataSection => {
                    inside_cdata = true;
                }
                Event::EndCdataSection => {
                    inside_cdata = false;
                    cdatas.push_str(",");
                }

                _ => {}
            },

            Err(_err) => {
                break;
            }
        }
    }

    let comments_expected = r#" This is a comment ,comments can be,here,here,and here,"#;
    let cdatas_expected = r#"abc,<&>, ]] & < >  ,"#;
    // println!("{}", result);
    assert_eq!(comments, comments_expected);
    assert_eq!(cdatas, cdatas_expected);
}