#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




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:

xml_schema_generator = "0.6.12"


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


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]

            xml file that shall be parsed

            rust file to store the result, or none to print to stdout

    -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


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




~64K SLoC