#xml-schema #xml #xml-parser #schema #serde #string #xml-format

bin+lib xml_schema_generator

Create Rust struct for given XML file, that allows to deserliaze the given XML using serde or vice versa

22 unstable releases (5 breaking)

new 0.6.12 Jul 19, 2024
0.6.7 Mar 6, 2024
0.6.5 Dec 17, 2023
0.6.0 Nov 27, 2023

#1486 in Parser implementations

Download history 56/week @ 2024-03-31 2/week @ 2024-04-07 13/week @ 2024-04-21 315/week @ 2024-04-28 1/week @ 2024-05-05 1/week @ 2024-05-26 2/week @ 2024-06-02 142/week @ 2024-06-09 15/week @ 2024-06-16 104/week @ 2024-06-23 146/week @ 2024-06-30 5/week @ 2024-07-07 38/week @ 2024-07-14

293 downloads per month

Apache-2.0

120KB
3K SLoC

xml_schema_generator

github crates.io docs.rs build status audit status

Library and Binary to convert a given XML input using quick_xml to generate a Struct (as String or file) that you can use in your Rust program to serialize or deserialize XML of the same format

You can add this dependency with:

[dependencies]
xml_schema_generator = "0.6.12"

Example

How to implement the lib

    use quick_xml::reader::Reader;
    use xml_schema_generator::{into_struct, Options};

    let xml = "<a b=\"c\">d</a>";
    let mut reader = Reader::from_str(xml);
    
    if let Ok(root) = into_struct(&mut reader) {
        let struct_as_string = root.to_serde_struct(&Options::quick_xml_de());
        // save this result as a .rs file and use it to (de)serialize an XML document with quick_xml::de::from_str(xml)
    }
        
    // you can even parse additional compatible xml files to extend the structure to match those files as well
    // see examples/parse_multiple_xml_rs

You find more examples in the /examples directory

Install

from source (env_logger is optional if you do not require additional output)

    cargo install xml_schema_generator --features="env_logger"

or download the latest binary at GitHub

How to run the binary

    Usage: [RUST_LOG=info] xml_schema_generator [OPTIONS] <INPUT_PATH> [OUTPUT_PATH]

    Arguments:
    <INPUT_PATH>
            xml file that shall be parsed

    [OUTPUT_PATH]
            rust file to store the result, or none to print to stdout

    Options:
    -p, --parser <PARSER>
            define the parser that is used to parse the resulting struct
            
            [default: quick-xml-de]
            [possible values: quick-xml-de, serde-xml-rs]

    -d, --derive <DERIVE>
            define the #derive attribute to be added to each resulting struct
            
            [default: "Serialize, Deserialize"]

    -s, --sort <SORT>
            sorting order for attributes and children
            
            [default: unsorted]

            Possible values:
            - unsorted: the order remains as found in document
            - name:     sort attributes and children by name (as given in XML). attributes and children are not merged

    -h, --help
            Print help (see a summary with '-h')

    -V, --version
            Print version

Web Assembly

You can take a look at the result of xml_schema_generator at xml_schema_generator Github Pages

For contribution details take a look into the wasm/README.md

Contribution

Just create a well tested Pull Request in github

Implemented features

☑ parse UTF-8 xml file

☑ generate Rust struct

☑ detect optional attributes

☑ detect optional children

☑ add a binary to run this lib independently

☑ replace panic! with Result<>

☑ added serde_xml_rs support

☑ added Option to change the derive attribute

☑ add Options (serde_xml_rs and derive attribute) to binary

☑ parse multiple XML files into one result

☑ attributes and children can be sorted for improved readability

☑ web assembly integration

Ideas (if needed or requested via github)

☐ implement xml:space (default|preserve)

☐ properly parse namespaces and reflect them in the Rust Struct

☐ detect numeric and boolean fields

☐ support enum

☐ improve the implementation of String, &str and [u8]

☐ improve performance

☐ support UTF-16

☐ suppport ISO_2022_JP

License

Apache-2.0

Dependencies

~2.6–3.5MB
~64K SLoC