# xml_schema_generator
[](https://github.com/thomblin/xml_schema_generator)
[](https://crates.io/crates/xml_schema_generator)
[](https://docs.rs/xml_schema_generator)
[](https://github.com/thomblin/xml_schema_generator/actions?query=branch%3Amain)
[](https://github.com/thomblin/xml_schema_generator/actions?query=branch%3Amain)
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:
```toml
[dependencies]
xml_schema_generator = "0.6.15"
```
## Example
How to implement the lib
```rust
use quick_xml::reader::Reader;
use xml_schema_generator::{into_struct, Options};
let xml = "d";
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](https://github.com/Thomblin/xml_schema_generator/tree/main/examples)
# Install
from source (env_logger is optional if you do not require additional output)
```bash
cargo install xml_schema_generator --features="env_logger"
```
or download the latest binary at [GitHub](https://github.com/Thomblin/xml_schema_generator/releases)
How to run the binary
```bash
Usage: [RUST_LOG=info] xml_schema_generator [OPTIONS] [OUTPUT_PATH]
Arguments:
xml file that shall be parsed
[OUTPUT_PATH]
rust file to store the result, or none to print to stdout
Options:
-p, --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
define the #derive attribute to be added to each resulting struct
[default: "Serialize, Deserialize"]
-s, --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](https://thomblin.github.io/xml_schema_generator/)
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