A comprehensive library for parsing XML schemas and generating code based on them.
This project originated as a fork of xsd-parser-rs but has since evolved into a complete rewrite.
If you enjoy the project and would like to support my work, you can buy me a coffee or send a tip via PayPal. Thanks a lot! 😊
This library is built around a staged transformation pipeline that converts XML schemas into Rust source code. Each stage handles a specific level of abstraction and produces a well-defined intermediate representation. This makes the library highly flexible, testable, and suitable for advanced customization or tooling.
-
Parsing: The parsing stage is handled by the
Parsertype. It loads XML schemas from files or URLs and uses pluggableResolvers to fetch and preprocess schema definitions. The result is captured in aSchemasmodel, which stores namespaces, prefixes, and the raw schema structure needed for further processing. -
Interpreting:: Interpreting is carried out by the
Interpreter. This stage analyzes the schema definitions stored in theSchemasmodel and converts them into normalized, abstract type descriptions. The resultingMetaTypesmodel encapsulates schema semantics such as complex types, enumerations, references, and groups in a language-agnostic form. -
Optimizing: Optimization is performed by the
Optimizer, which takes theMetaTypesand applies structural transformations. These include deduplication, simplification of unions, merging cardinalities, and resolving typedef aliases. The goal is to prepare the type graph for idiomatic translation into Rust while reducing complexity. -
Generating: The generation step uses the
Generatorto transform the abstract types into Rust-specific type data. It produces theDataTypesmodel by attaching names, Rust derivations, trait support, and rendering metadata. These enriched types form the basis for later rendering while still preserving schema semantics. -
Rendering: Rendering is handled by the
Renderer, which convertsDataTypesinto structured Rust code organized in aModule. It uses theRenderSteptrait to define individual rendering steps. Several built-in steps are available, including support forserdeorquick-xml. Users can also add customRenderStepimplementations to extend or modify the output.
-
Schemas: This model is built by theParserand contains the raw XML schema data, including namespaces, prefixes, and schema file content. It serves as the foundation for interpretation and supports multiple sources and resolver types. -
MetaTypes: Generated by theInterpreter, this model contains language-neutral type definitions. It includes data like complex types, references, enumerations, and groupings derived from schema structure. It is suitable for introspection, transformation, and optimization. -
DataTypes: Produced by theGenerator, this model holds enriched Rust-specific type data. Each type includes metadata for layout, naming, derivations, and other traits required for rendering idiomatic Rust code. This is the core input for the rendering process. -
Module: The final model is produced by theRenderer. It wraps the Rust source code output into a structured format, ready for file output or consumption as token streams. Modules support nested submodules, file splitting, and embedded metadata for customization.
This library provides the following features:
- Rust Code Generation: Convert any XML schema into Rust code.
- Layered Architecture: Add user-defined code to manipulate type information or generated code.
- User-Defined Types: Inject existing types into the generated code to reuse predefined structures.
serdeSupport: Generate code for serialization and deserialization usingserdewithserde_xmlorquick_xmlas serializer/deserializer.quick_xmlSupport: Direct serialization/deserialization support usingquick_xml, avoidingserdelimitations and leveraging asynchronous features. Code generated for very large schemas may need a higher# in the crate that includes it.
The usual setup generates the code in the build script of your crate. Add xsd-parser as build dependency and xsd-parser-types (with the features your generated code needs, e.g. quick-xml) as normal dependency:
[dependencies]
xsd-parser-types = { version = "0.3", features = ["quick-xml"] }
[build-dependencies]
xsd-parser = "1.6"Then generate the code in build.rs and include it from your crate:
use std::{env, fs, path::PathBuf};
use xsd_parser::{config::Schema, generate, Config, Error};
fn main() -> Result<(), Error> {
let config = Config::default()
.with_schema(Schema::File("schema/my-schema.xsd".into()))
.with_quick_xml();
let code = generate(config)?;
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
fs::write(out_dir.join("my_schema.rs"), code.to_string())?;
Ok(())
}// src/lib.rs
pub mod my_schema {
include!(concat!(env!("OUT_DIR"), "/my_schema.rs"));
}The examples in xsd-parser/examples and examples show more advanced setups, and the feature tests in xsd-parser/tests/feature contain a small schema, the used Config and the generated code for almost every feature.
GeneratorFlags::all()includesADVANCED_ENUMS: Advanced enums need theRenderStep::EnumConstantsrender step, otherwise the generated code does not compile (VALUE_*constants are missing). Either useConfig::with_advanced_enums, which adds both, or remove the flag (GeneratorFlags::all() - GeneratorFlags::ADVANCED_ENUMS).InterpreterFlags::all()includesWITH_NUM_BIG_INT: Unbounded XSD integer types are then generated asnum::BigInt/num::BigUint. Addnumto your dependencies and enable thenumfeature ofxsd-parser-typesif the types are (de)serialized withquick-xml.- Features of
xsd-parser-typesmust match the render steps: Code generated withquick-xmlsupport needs thequick-xmlfeature (andasyncfor the async reader),serdesupport needs theserdefeature, and the decoding types ofConfig::with_base64binary_typeneed thebase64feature. - Documents that are not UTF-8: The
IoReaderandSliceReaderonly accept UTF-8. Use theDecodingIoReaderofxsd-parser-typesto read other encodings (detected from the BOM or the XML declaration, sync only), and theEncodingWriterto write them. Itswrite_documentmethod writes the value as complete document with a matching XML declaration (the serializers themselves never write a declaration). - Unknown elements are rejected by default: The
quick-xmldeserializer fails on elements that are not part of the schema. Use theskip_unknown_elementsoption ofRenderStep::QuickXmlDeserialize(orConfig::with_quick_xml_config) to skip them. - Dynamic types without
abstract: Types that are only used throughxsi:typebut are not declared asabstractmust be marked withConfig::with_dynamic_type, otherwise the derived types are not taken into account. - Name conflicts: If two schema types end up with the same Rust name, the generator returns a
DuplicateTypeNameerror. EnableGeneratorFlags::USE_MODULES(one module per namespace) or assign custom names (see thecustom_namesandcustom_namingexamples). - Very large schemas: The generated code for large schemas may need a higher
# in the crate that includes it.
- Schema-Based Validation: Generate validators directly from schemas to validate XML data during reading or writing.
Below you can find a list of some benchmarks for serializing and deserializing different XML documents for different schemas. For more details please have a look to the benchmark crate.
| Schema | Document | Engine | Op | Min | Avg | Mdn | Max | Stack |
|---|---|---|---|---|---|---|---|---|
| XMLSchema | XMLSchema | quick_xml | serialize | 303.71 µs | 349.34 µs | 327.66 µs | 528.52 µs | 9.4 KiB |
| XMLSchema | XMLSchema | quick_xml | deserialize | 1.70 ms | 1.77 ms | 1.76 ms | 1.95 ms | 142.8 KiB |
| XMLSchema (boxed) | XMLSchema | quick_xml | deserialize | 1.62 ms | 1.70 ms | 1.69 ms | 1.89 ms | 74.8 KiB |
| XMLSchema | ONIX_BookProduct_3.1 | quick_xml | serialize | 3.03 ms | 3.15 ms | 3.14 ms | 3.31 ms | 7.4 KiB |
| XMLSchema | ONIX_BookProduct_3.1 | quick_xml | deserialize | 18.38 ms | 18.85 ms | 18.84 ms | 20.02 ms | 118.0 KiB |
| XMLSchema (boxed) | ONIX_BookProduct_3.1 | quick_xml | deserialize | 16.57 ms | 16.84 ms | 16.81 ms | 17.41 ms | 68.3 KiB |
| XMLSchema | XJustiz 3.4.1 (dabag) | quick_xml | serialize | 1.08 ms | 1.14 ms | 1.13 ms | 1.23 ms | 39.4 KiB |
| XMLSchema | XJustiz 3.4.1 (dabag) | quick_xml | deserialize | 8.45 ms | 8.61 ms | 8.60 ms | 8.84 ms | 520.7 KiB |
| XMLSchema (boxed) | XJustiz 3.4.1 (dabag) | quick_xml | deserialize | 7.15 ms | 7.32 ms | 7.32 ms | 7.53 ms | 263.0 KiB |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | quick_xml | serialize | 3.38 µs | 3.65 µs | 3.57 µs | 8.05 µs | 0 B |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | serde (quick_xml) | serialize | 4.06 µs | 4.24 µs | 4.21 µs | 5.35 µs | 0 B |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | serde (xml_rs) | serialize | 4.55 µs | 4.75 µs | 4.72 µs | 6.05 µs | 1.1 KiB |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | quick_xml | deserialize | 14.26 µs | 14.99 µs | 14.64 µs | 21.14 µs | 15.4 KiB |
| iDEAL 3.3.1 Merchant-Acquirer (boxed) | merchant-acquirer.xml | quick_xml | deserialize | 12.07 µs | 12.39 µs | 12.29 µs | 17.11 µs | 10.9 KiB |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | serde (quick_xml) | deserialize | 10.99 µs | 11.68 µs | 11.58 µs | 16.60 µs | 4.7 KiB |
| iDEAL 3.3.1 Merchant-Acquirer | merchant-acquirer.xml | serde (xml_rs v0.7) | deserialize | 36.52 µs | 39.67 µs | 39.45 µs | 50.80 µs | 8.9 KiB |
The benchmarks were created on the following system:
- OS: Linux (Ubuntu 24.04)
- Kernel: Linux 7.0.0-42-generic
- CPU Arch: x86_64
- CPU Brand: 12th Gen Intel(R) Core(TM) i9-12900H
- CPU Vendor: GenuineIntel
- CPU Cores (logical): 20
- CPU max Frequency: 4900.00 MHz
Below you can find a short list of the most important changes for each released version.
-
Stable Names for Merged Content Types Since 1.6.0 complex types share the content types that
OptimizerFlags::REMOVE_DUPLICATESmerged. The shared type got the name of the first owner and an internal counter (e.g.AncillaryContentDescriptionContent85) and was defined in the module of that owner. The name is now derived from the schema: copies of the samexs:groupare merged into a type named like the group (<Group>Contentif the name is already used), defined in the module of the group, and the content of a base type is shared with its derived types as<Base>Content, defined in the module of the base type. Content types of unrelated complex types are not merged anymore. -
Separate Flags for Types and Content Types
REMOVE_DUPLICATESis now the combination of the new flagsREMOVE_DUPLICATE_TYPESandREMOVE_DUPLICATE_CONTENTS. UseOptimizerFlags::all() - OptimizerFlags::REMOVE_DUPLICATE_CONTENTSto keep one content type per complex type, like in version 1.5. -
Breaking Changes
- The generated code changes for schemas with merged content types, see above.
GroupMetahas the new fieldgroup.
- Reading and Writing Other Encodings
xsd-parser-types0.3.1 adds theDecodingIoReader, which decodes the input based on the BOM or the XML declaration (e.g.Windows-1251orUTF-16), and theEncodingWriter, which encodes the serialized output (write_documentwrites a complete document including the matching XML declaration). Characters that can not be represented in the target encoding are written as numeric character references in text and attribute values. Since the upgrade toquick-xml0.42 theIoReaderonly accepts UTF-8.
This release adds proper support for dynamic and abstract types, opt-in skipping of unknown elements and dedicated types for binary data. It also upgrades quick-xml to 0.42 and fixes a long list of issues found with real-world schemas. Because xsd-parser-types re-exports quick-xml types, it gets a new minor version (0.3.0). Please have a look at the breaking changes at the end of this section before upgrading.
-
Proper Support for Dynamic and Abstract Types Abstract complex types and types configured as dynamic (
Config::with_dynamic_type) are now generated as dynamic types, also in combination with substitution groups. The concrete types of a substitution group or a dynamic type use a separate postfix (Dynby default, seeConfig::with_dynamic_element_postfix). The new optimizer flagMERGE_DYNAMIC_TYPESstores substitution group members and derived types of the same element in one dynamic type. -
Opt-In Skipping of Unknown Elements The
quick_xmldeserializer can now skip unknown elements including their whole subtree. The option is enabled with the newskip_unknown_elementsfield ofRenderStep::QuickXmlDeserialize(or the new parameter ofConfig::with_quick_xml_deserialize_configandConfig::with_quick_xml_config). Known elements at an unexpected position still fail. Without the option the generated code is unchanged and unknown elements are rejected. -
Types for
base64andhexEncoded Dataxs:base64Binaryandxs:hexBinaryare now mapped to the newBase64StringandHexStringtypes ofxsd-parser-types, which keep the encoded value, instead ofString. Length facets are now checked against the decoded data instead of the encoded string. The decoding variantsBase64BinaryandHexBinarycan be used withConfig::with_base64binary_typeandConfig::with_hexbinary_type. -
Upgrade to
quick-xml0.42quick-xmlwas upgraded from 0.38 to 0.42 (including the fixes for the RustSec DoS advisories of older versions). The byte-based API ofxsd-parser-typesstays as it is, the changes are handled at thequick-xmlboundary. Input that is not valid UTF-8 is now rejected with an encoding error. The required toolchain was raised to Rust 1.95 and all other dependencies were updated to their latest versions. -
Custom Generator Code Custom types (
CustomMeta) can carry aCustomGeneratorthat is executed when the generator processes the type, for example to generate dependent types or to resolve type paths. -
Helper Functions for Flattened Content The new
RenderStep::ContentHelpersgenerates accessor methods for structs with flattened content (e.g.fn private_note(&self) -> Option<&String>). -
Shared Content Types Complex types that use the same content (e.g. through the same
xs:group) now share one generated content type instead of getting a copy per owner. -
Configurable Name for Content Fields The name of the generated content field can be changed with
Config::with_content_display_name, to avoid conflicts with schema attributes or elements calledcontent. -
Better Error Reporting
- The interpreter returns errors instead of panicking for types that are missing or not generated yet, and
InterpreterError::NoTypenames the affected type - The generator returns the new
Error::DuplicateTypeNameif two schema types would be generated with the same name, instead of producing code that does not compile - Invalid user provided identifier paths (derives, includes of custom types) return errors instead of panicking
- File resolver and parser errors now contain the affected file path (
FileResolverError,InvalidFilePath)
- The interpreter returns errors instead of panicking for types that are missing or not generated yet, and
-
Additional Bug Fixes
- Fixed a panic for derived types that are declared before their base type
- Fixed a panic in the interpreter for multiple schemas without
RESOLVE_INCLUDES - Fixed
xs:patternfacets of different derivation steps, they are now combined with AND as required by the XSD specification - Fixed substitution group members without a type, they now use the type of their head instead of
xs:anyType - Fixed global attributes without a type, they now use
xs:stringlike local attributes - Fixed
quick_xml(de)serialization of newtypes of complex types (TypedefMode::NewType) - Fixed default values of
xs:elementfor simple content types (e.g. extensions ofxs:boolean) - Fixed
quick_xmldeserialization of choices with a group variant followed by an unexpected element, and of mixed choices with leading text - Fixed the trait implementation of dynamic types for derived types that are generated before their base
- Fixed boxing of recursive types through shared content types
- Fixed
USE_UNRESTRICTED_BASE_TYPE_COMPLEXfor types that restrict an abstract base type - Fixed
xmlnsemission for schemas with unqualified elements - Fixed
GENERATE_PREFIXESnot assigning the generated prefix to the namespace - Fixed the
Defaultimplementation of defaultable choices with a single option - Fixed render steps being added twice by the config helpers
xs:documentationentries are now rendered as separate paragraphs, and documentation with CRLF line endings is unindented correctlyxsd-parser-typescan be built with thexmlfeature but withoutquick-xml
-
Breaking Changes
xsd-parser-types0.3.0:quick-xmltypes in the public API changed with the upgrade to 0.42.read_attribtakes the attribute value as&str, the dynamic type name helpers returnCow<str>, andKey::qname,Key::prefix_decl,Value::namespaceandElement::qnamereturn aResult.- Input that is not valid UTF-8 is rejected by the
quick_xmldeserializer. - Building requires a newer compiler, the pinned toolchain was raised from Rust 1.86 to 1.95.
RenderStep::QuickXmlDeserializehas the newskip_unknown_elementsfield, andConfig::with_quick_xml_deserialize_configandConfig::with_quick_xml_configtake an additional parameter.Constrains::patternsis grouped per derivation step (Vec<Vec<String>>), and the generated pattern validation is stricter.InterpreterError::NoTypecarries the identifier of the affected type, and the generator error has the new variantDuplicateTypeName.- The generated code changes for several schemas: abstract types are generated as dynamic types, content types may be shared between complex types,
xs:base64Binaryandxs:hexBinaryuse the new types, and substitution group members without a type use the type of their head.
This release introduces several new schema features, a refactored identifier system, improved deserialization, and a range of bug fixes targeting real-world XSD compatibility.
-
Support for
xs:anySimpleTypexs:anySimpleTypeis now handled as a distinct type instead of being silently mapped toxs:string. A newAnySimpleTyperuntime type was added toxsd-parser-types, and the generator can be configured to use any custom type in its place. -
Support for
xs:redefineandxs:overrideThe parser and interpreter now support thexs:redefineandxs:overrideschema composition mechanisms, enabling proper handling of schemas that redefine or override type definitions from imported schema files. -
Namespace-Aware Enum Serialization and Deserialization Enum values that carry namespace-prefixed content (e.g.,
tns:Sender) are now correctly serialized and deserialized by resolving the namespace URI at runtime rather than comparing literal prefix strings. This fixes incorrect behavior for enums derived fromxs:QName-like patterns. -
Support for Duplicated Type Identifiers Across Schema Files The identifier system was restructured to distinguish between types from different schema files. The previous
Identtype was split intoTypeIdent,NodeIdent, andPropertyIdent.TypeIdentnow carries aSchemaId, enabling correct resolution of types that share a name across multiple schema files. -
DerivedTypeMetafor Naming Conflict Resolution A newDerivedTypeMetastructure tracks derived types and their display names withinDynamicMeta. This resolves naming conflicts that occurred when multiple derived types shared the same name across different schemas (e.g., AIXM schema). -
Support for Non-Zero Integer Types Integer types with matching XSD constraints can now be mapped to Rust's
NonZero*types (e.g.,NonZeroU8,NonZeroI32). This is independent of theWITH_NUM_BIG_INTfeature and can be enabled via generator configuration. -
Improved Name Generation The
Namingtrait and its built-in implementations were improved to handle more edge cases, including duplicate group names and nested types that previously caused naming collisions in generated code. -
Anchored Regex Pattern Validation Pattern facets (
xs:pattern) are now correctly anchored at the start and end (^...$) as required by the XSD specification. Additionally, patterns with alternation are wrapped in a non-capturing group to prevent partial anchoring issues. -
Improved
quick_xmlDeserialization Thequick_xmldeserializer received a comprehensive overhaul, improving correctness for complex schema patterns such as dynamic types, mixed content, and deeply nested structures. -
New Examples and Benchmarks
- Added a
BPMN 2.0example project - Added a
VSMEschema example project - Added memory usage and performance benchmarks to the
benchmarkcrate
- Added a
-
Additional Bug Fixes
- Fixed edge case in
quick_xmldeserialization of simple list types - Fixed namespace serialization for the
Elementtype - Fixed list deserialization when using non-whitespace separators
- Fixed invalid character escaping when deserializing XML attributes
- Fixed naming collision for group types reused across inheritance hierarchies
- Fixed
WithNamespaceTraitgenerating conflicting implementations for type aliases - Fixed empty list handling (previously reported as an error)
- Fixed a typo in the
with_element_type_postfixsetter method
- Fixed edge case in
This release focuses on extending customization options, improving quick_xml serialization/deserialization, and restructuring the crate into a more modular form. It also includes numerous fixes for naming, type handling, and schema interpretation issues found in real-world XSDs.
-
Customizable Name Generation The entire naming system has been reworked to allow full customization of how identifiers are formatted and generated. This includes support for handling reserved keywords, resolving name collisions, and providing user-defined naming strategies.
-
Crate Split into
xsd-parserandxsd-parser-typesThe library is now split into two crates. All runtime types and dependencies were moved intoxsd-parser-types, reducing dependency overhead for users of the generator and improving compatibility with downstream projects. -
Improved
quick_xmlSerializer/Deserializer Thequick_xmlbackend received a comprehensive refactor. Namespace serialization has been improved, state naming is simplified, async reading tests were added, and multiple edge cases involvingxs:any,xs:anyType, CDATA, mixed content, and boxed types are now handled correctly. -
Extended Interpreter and Generator Capabilities Several complex schema patterns are now correctly interpreted and rendered:
- complex/simple content combinations with mixed or emptyable bases
- extended types with mixed content
- facets applied to enums, unions, and simple types
- improved handling of
xs:any,xs:anyAttribute, and custom XML runtime types - unified configuration for XML helper types
- new optimizer step to replace
xs:anyTypewithAnyElementwhere appropriate
-
Absolute Path Support Improvements Both
GeneratorFlags::BUILD_IN_ABSOLUTE_PATHSand the newGeneratorFlags::ABSOLUTE_PATHS_INSTEAD_USINGSflag now ensure that all built-in types and traits are resolved using absolute paths, reducing the risk of naming conflicts. -
Additional improvements include
- faster loop detection for large schemas resulting in better performance while code generation
- improved namespace handling and prefix resolution
- more reliable display names during serialization
- fixes for mixed choices, nested
xs:any, substitution groups, and enum/union facets - updated schema definitions and expanded test coverage
This release introduces new configuration options, enhanced schema modularization, extended type handling, improved serializer support, and broader schema compatibility. It also addresses a range of long-standing issues with stability and schema validation.
-
New Examples and Customization Options An example for custom named enum variants has been added, showcasing how to override generated names with user-defined ones. The renderer context was refactored and expanded with helper methods, giving developers more control over schema-level configuration and code generation behavior.
-
Schema Modularization Generated code can now be split into modules per schema definition. This improves maintainability and separation of concerns when working with large or multi-schema projects. Meta information is now attached to schemas, making it easier to inspect and debug schema processing.
-
Support for Additional Schemas Support for the OFD schema was added to the test suite, expanding real-world coverage. Compatibility with the ONIX schema was introduced, ensuring support for publishing and book-industry data standards.
-
Extended Type Handling A new option allows the use of the full path for built-in types, ensuring unambiguous references in complex projects. A new
models::data::TagNametype was introduced to provide consistent and reliable handling of XML tag names across the pipeline. Inline element types are now lazily interpreted, reducing memory usage and improving performance for large schemas. Restrictions expressed throughxs:facetare now evaluated and applied to simple type definitions, closing a gap in schema validation support. -
Improved Serializer Support A new configuration for the
quick_xmlserializer has been implemented, making it possible to fine-tune serialization behavior. Existing schema tests were updated to use the new serializer configuration, ensuring consistent results across different serializers. -
Bug Fixes and Stability Improvements
- Fixed escaping and unescaping of mixed content and special characters
- Resolved interpreter errors with self-referencing types
- Fixed duplicate type names generated when an attribute named
Typewas present - Corrected deserialization failures for XML with
elementFormDefault=qualified - Included schemas now properly inherit their target namespace instead of defaulting incorrectly
- Restored missing integration tests and expanded coverage for real-world scenarios
This release introduces a series of architectural improvements, enhanced flexibility in code generation, and broader schema compatibility.
-
Refactored Pipeline Structure The internal code generation pipeline has been refactored to introduce a new
Rendererstep and an accompanyingDataTypemodel. This separation gives users more control over the rendering process, allows better extension points for customization, and prepares the architecture for further growth. -
Refactored Serde Support Support for
serdehas been moved into dedicated renderer steps. This makes it possible to support multiple versions ofserde-based implementations, such asserde-xml-rs0.7 and 0.8, without mixing code. Each renderer step now cleanly encapsulates the logic for one serialization backend. -
Implement Support for Unstructured Data Added support for
xs:anyandxs:anyAttributeby introducing an internal representation for unstructured XML data. This enables working with flexible or unknown schema elements and fixes a long-standing gap in schema coverage. -
Implement Support for
BigIntandBigUintSchemas defining integer types without upper bounds can now be mapped tonum::BigIntornum::BigUint, depending on context. This is useful when working with large numeric values. -
Improved Documentation Support XSD annotations (
xs:documentation) are now parsed and included as Rust doc comments in the generated code, improving type-level visibility and usability. -
Different Bug Fixes and Improvements
- Enum restrictions on text types are now correctly interpreted and rendered
- Complex types in the XML Catalog schema are now rendered correctly
- Introduced per-type
derivesettings for advanced customization - Various naming, escaping, and formatting issues were resolved across the pipeline.
- Generated names of nested elements now uses the name of the parent element as prefix to prevent name collisions.
- Implemented feature to generated boxed
quick_xmldeserializers to reduce stack usage during deserialization - Improved naming of the generated types
- Implemented feature to split generated code into multiple module files
- Improved and implemented advanced examples
- General bug fixes and improvements
- First official release of
xsd-parser
This crate is licensed under the MIT License.