NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1002 most downloaded on crates.io
Represent an XML as a read-only tree.
Last release 12 months ago
12 Oct 2025
Release timing varies
gaps range from 8 days to 1.4 years
Nearly every release is documented
notes for 31 of 32 stable releases
2 versions withdrawn
withdrawn after publishing
8 years old
34 releases · first in 2018
Also upgrade it from FnMut to Fn as borrowing entities from elsewhere…
Also upgrade it from FnMut to Fn as borrowing entities from elsewhere…
'static lifetime bound on EntityResolver dyn trait type alias.EntityResolver dyn trait type alias from FnMut to Fn to resolve lifetime issues.Fix benchmark build, update changelog and bump version.
Fix benchmark build, update changelog and bump version.
One column per quarter.
ParsingOptions::entity_resolver can be used to resolve external entities referenced via public ID and URI.Node::has_attribute, Node::attribute and Node::attribute_node match local names similar to how Node::has_tag_name works.memchr for finding delimiters.Attribute::position is deprecated now.
Attribute::range, Attribute::range_qname, Attribute::range_value.
Thanks to @JayonasAttribute::position is deprecated now.positions build feature uses a bit more memory now to better preserve attribute ranges.xmlparser is no longer a dependency and its fork is used internally.
xmlparser is no longer a dependency and its fork is used internally.Rc when Arc isn't available.Error variants have changed quite a lot.version, encoding and standalone can contain any value now.
But we still do check attribute names and order.<br/>
And while we did validated those attributes before, they weren't really affecting
the parser in any way. Therefore the parsing behavior is mostly unchanged.ParsingOptions::allow_dtd = false would not trigger an error when an empty DTD was present.xmlparser dependency.ExpandedName::from_static. Thanks to @WhyNotHugo
ExpandedName::from_static.
Thanks to @WhyNotHugo\r in CDATA as well.no_std build.
Thanks to @wenyuzhaoStringStorage that exposes an internal string storage.
StringStorage that exposes an internal string storage.Arc<str> and not String now.Node::text_storageNode::tail_storageAttribute::value_storageNode::rangeNode::position. Use Node::range instead.Stored namespaces are deduplicated now, which can reduce memory usage on large files up to 10%. Thanks to @adamreichold
Node::namespaces returns an iterator and not a slice now.Drop attrs_start_idx and use drain when resolving attributes.
Drop attrs_start_idx and use drain when resolving attributes.
positions build feature.Node::positionAttribute::positionParsingOptions::nodes_limit to limit the maximum number of nodes to parse.Node::attributes returns an iterator and not a slice now.Node::range. Use position instead.Attribute::range. Use position instead.Attribute::value_rangeBump xmlparser to prevent stack overflow on some input.
xmlparser to prevent stack overflow on some input.Extend Document::descendants lifetime. Thanks to @DBLouis.
Document::descendants lifetime.
Thanks to @DBLouis.Eq and Hash for NodeId.pretty_assertions dev-dependency.The std feature is enabled by default now.
std feature is enabled by default now.An ability to reject XML with DTD in it.
ParsingOptionsDocument::parse_with_optionsError::DtdDetected### Added - Debug for all public types.
Debug for all public types.Better ExpandedName lifetimes. Thanks to @eduardosm.
ExpandedName lifetimes. Thanks to @eduardosm.Re-release 0.11.1, since it had a breaking change.
Extend ExpandedName lifetime. Thanks to @rkusa.
ExpandedName lifetime. Thanks to @rkusa.Implement Ord, PartialOrd and Hash for Node. Thanks to [@tomjw64].
Ord, PartialOrd and Hash for Node. Thanks to [@tomjw64].NodeId, Document::get_node and Node::id. Thanks to [@tomjw64].Node can be accessed from multiple threads now.Node memory usage.Descendants iterator. Up to 5x faster in some cases. Thanks to [@tomjw64].Node::traverse, Traverse and Edge. Use Node::descendants instead.Node::prev_sibling_element and Node::next_sibling_element were returning the current node.
Node::prev_sibling_element and Node::next_sibling_element
were returning the current node.Ancestors, PrevSiblings, NextSiblings, FirstChildren and LastChildren were replaced with AxisIter.
Document::input_textAncestors, PrevSiblings, NextSiblings, FirstChildren and LastChildren
were replaced with AxisIter.A better entity loop detection. A document can have an unlimited number of references at zero depth now.
### Changed - Moved to Rust 2018. - xmlparser updated.
xmlparser updated.Error::MalformedEntityReference
Error::MalformedEntityReference< in attribute inside an ENTITY is an error now.xmlparser updated with multiple fixes.Use unconstrained lifetimes for the attribute functions. By myrrlyn.
attribute functions.
By myrrlyn.Use longer lifetimes in Document::root_element. By myrrlyn.
Document::root_element.
By myrrlyn.### Changed - Update xmlparser.
xmlparser.Node::prev_sibling_element and Node::next_sibling_element.
Node::prev_sibling_element and Node::next_sibling_element.Node::ancestors includes the current node now.Attribute is cloneable now.Node::resolve_tag_name_prefix.### Fixed - Namespace resolving.
Unknown namespace prefixes will cause an error now.
Error::UnknownNamespace.Rename text_pos_from into text_pos_at.
Node::range.Node::attribute_node.Attribute::range.Attribute::value_range.text_pos_from into text_pos_at.Node::pos. Use Node::range instead.Node::node_pos. Use doc.text_pos_at(node.range().start) instead.Node::attribute_pos.Node::attribute_value_pos.Attribute::pos. Use Attribute::range instead.Attribute::value_pos. Use Attribute::value_range instead.Use longer lifetimes in return types. By tmiasko.
### Added - Error::pos().
Error::pos().Store text nodes as &str when possible. On an XML with a lot of simple text can be ~2x faster.
&str when possible. On an XML with a lot of simple text can be ~2x faster.Document no longer implements PartialEq.Nested entity references support.
Error::EntityReferenceLoop.Attribute::namespace will return Option now.ExpandedName::namespace will return Option now.Namespace::name will return Option now.Node::resolve_tag_name_prefix will return Option now.Node::lookup_namespace_uri accepts Option<&str> and not &str now.ExpandedName::has_namespace. ExpandedName::namespace will return Option now.Error::NestedEntityReference.Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →