# Change Log
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

## [0.20.0] - 2024-05-23
### Added
- `Attribute::range`, `Attribute::range_qname`, `Attribute::range_value`.
  Thanks to [@Jayonas](https://github.com/Jayonas)

### Changed
- `Attribute::position` is deprecated now.
- The `positions` build feature uses a bit more memory now to better preserve attribute ranges.

## [0.19.0] - 2023-11-18
### Changed
- `xmlparser` is no longer a dependency and its fork is used internally.
- ~5% faster parsing.
- Fallback to `Rc` when `Arc` isn't available.
- Bump MSRV to 1.60
- Bump edition to 2021
- `Error` variants have changed quite a lot.
- XML declaration validation was simplified. We no longer check for attributes content.
  Meaning that `version`, `encoding` and `standalone` can contain any value now.
  But we still do check attribute names and order.
  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.

### Fixed
- `ParsingOptions::allow_dtd = false` would not trigger an error when an empty DTD was present.

### Removed
- The `xmlparser` dependency.

## [0.18.1] - 2023-09-30
### Added
- `ExpandedName::from_static`.
  Thanks to [@WhyNotHugo](https://github.com/WhyNotHugo)

### Fixed
- Replace `\r` in CDATA as well.
- `no_std` build.
  Thanks to [@wenyuzhao](https://github.com/wenyuzhao)

## [0.18.0] - 2023-02-04
### Added
- `StringStorage` that exposes an internal string storage.
- Allocated strings are stored as `Arc<str>` and not `String` now.
- `Node::text_storage`
- `Node::tail_storage`
- `Attribute::value_storage`
- `Node::range`

### Removed
- `Node::position`. Use `Node::range` instead.

### Fixed
- Some methods return longer lifetimes now.
  Thanks to [@adamreichold](https://github.com/adamreichold)
- Overly verbose Debug implementations.
  Thanks to [@adamreichold](https://github.com/adamreichold)

## [0.17.0] - 2023-01-06
### Added
- Stored namespaces are deduplicated now, which can reduce memory usage on large files up to 10%.
  Thanks to [@adamreichold](https://github.com/adamreichold)

### Changed
- `Node::namespaces` returns an iterator and not a slice now.

### Fixed
- Unclosed root element is an error now.
  Thanks to [@adamreichold](https://github.com/adamreichold)

## [0.16.0] - 2022-11-20
### Added
- `positions` build feature.
- `Node::position`
- `Attribute::position`
- `ParsingOptions::nodes_limit` to limit the maximum number of nodes to parse.

### Changed
- Peak memory usage reduces by up to 20% depending on an input.
  Thanks to [@adamreichold](https://github.com/adamreichold)
  and [@tomjw64](https://github.com/tomjw64).
- `Node::attributes` returns an iterator and not a slice now.

### Removed
- 4GB input limit.
- Do not store Node and Attribute end range in the original document.
- Do not store attribute value range in the original document.
- `Node::range`. Use `position` instead.
- `Attribute::range`. Use `position` instead.
- `Attribute::value_range`

## [0.15.1] - 2022-10-18
### Fixed
- Bump `xmlparser` to prevent stack overflow on some input.

## [0.15.0] - 2022-08-15
### Changed
- Extend `Document::descendants` lifetime.
  Thanks to [@DBLouis](https://github.com/DBLouis).
- Derive `Eq` and `Hash` for `NodeId`.
- Remove `pretty_assertions` dev-dependency.
- MSRV is now 1.36

## [0.14.1] - 2021-04-01
### Changed
- The `std` feature is enabled by default now.

## [0.14.0] - 2020-12-27
### Added
- An ability to reject XML with DTD in it.
- The library is no_std + alloc now.
- `ParsingOptions`
- `Document::parse_with_options`
- `Error::DtdDetected`

## [0.13.1] - 2020-12-19
### Added
- `Debug` for all public types.

## [0.13.0] - 2020-06-20
### Changed
- Better `ExpandedName` lifetimes. Thanks to [@eduardosm](https://github.com/eduardosm).

## [0.12.0] - 2020-06-20
### Changed
- Re-release 0.11.1, since it had a breaking change.

## [0.11.1] - 2020-06-19
### Changed
- Extend `ExpandedName` lifetime. Thanks to [@rkusa](https://github.com/rkusa).

## [0.11.0] - 2020-04-19
### Added
- Implement `Ord`, `PartialOrd` and `Hash` for `Node`. Thanks to [@tomjw64].
- `NodeId`, `Document::get_node` and `Node::id`. Thanks to [@tomjw64].

### Changed
- The input data size is limited by 4GiB now.
- `Node` can be accessed from multiple threads now.
- Reduce `Node` memory usage.
- Greatly optimized `Descendants` iterator. Up to 5x faster in some cases. Thanks to [@tomjw64].
- Heavily reduce memory usage when document has a lot of namespaces. Thanks to [@tomjw64].

### Removed
- `Node::traverse`, `Traverse` and `Edge`. Use `Node::descendants` instead.

## [0.10.1] - 2020-03-28
### Fixed
- `Node::prev_sibling_element` and `Node::next_sibling_element`
  were returning the current node.

## [0.10.0] - 2020-03-18
### Added
- `Document::input_text`

### Changed
- `Ancestors`, `PrevSiblings`, `NextSiblings`, `FirstChildren` and `LastChildren`
  were replaced with `AxisIter`.

### Fixed
- Root node range.

## [0.9.1] - 2020-02-09
### Changed
- A better entity loop detection. A document can have an unlimited
  number of references at zero depth now.

## [0.9.0] - 2020-01-07
### Changed
- Moved to Rust 2018.
- `xmlparser` updated.

## [0.8.0] - 2019-12-21
### Added
- `Error::MalformedEntityReference`

### Changed
- Malformed entity reference is an error now.
- Escaped `<` in attribute inside an ENTITY is an error now.
- `xmlparser` updated with multiple fixes.

## [0.7.3] - 2019-11-14
### Changed
- Use unconstrained lifetimes for the `attribute` functions.
  By [myrrlyn](https://github.com/myrrlyn).

## [0.7.2] - 2019-11-07
### Changed
- Use longer lifetimes in `Document::root_element`.
  By [myrrlyn](https://github.com/myrrlyn).

## [0.7.1] - 2019-09-14
### Changed
- Update `xmlparser`.

## [0.7.0] - 2019-08-06
### Added
- `Node::prev_sibling_element` and `Node::next_sibling_element`.

### Changed
- **(breaking)** `Node::ancestors` includes the current node now.
- `Attribute` is cloneable now.

### Fixed
- Namespaces resolving with equal URI's.

### Removed
- `Node::resolve_tag_name_prefix`.

## [0.6.1] - 2019-06-18
### Fixed
- Namespace resolving.

## [0.6.0] - 2019-03-03
### Added
- `Error::UnknownNamespace`.

### Fixed
- Unknown namespace prefixes will cause an error now.

## [0.5.0] - 2019-02-27
### Added
- `Node::range`.
- `Node::attribute_node`.
- `Attribute::range`.
- `Attribute::value_range`.

### Changed
- Rename `text_pos_from` into `text_pos_at`.

### Removed
- `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.

## [0.4.1] - 2019-01-02
### Changed
- Use longer lifetimes in return types. By [tmiasko](https://github.com/tmiasko).

## [0.4.0] - 2018-12-13
### Added
- `Error::pos()`.

## [0.3.0] - 2018-10-29
### Changed
- Store text nodes as `&str` when possible. On an XML with a lot of simple text can be ~2x faster.
- `Document` no longer implements `PartialEq`.

### Fixed
- Entity and character references resolving inside a text.

## [0.2.0] - 2018-10-08
### Added
- `Error::EntityReferenceLoop`.
- Nested entity references support.

### Changed
- `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.
- Performance optimizations.

### Removed
- `ExpandedName::has_namespace`. `ExpandedName::namespace` will return `Option` now.
- `Error::NestedEntityReference`.

[@tomjw64]: https://github.com/tomjw64

[Unreleased]: https://github.com/RazrFalcon/roxmltree/compare/v0.20.0..HEAD
[0.20.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.19.0...v0.20.0
[0.19.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.18.1...v0.19.0
[0.18.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.18.0...v0.18.1
[0.18.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.17.0...v0.18.0
[0.17.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.16.0...v0.17.0
[0.16.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.15.1...v0.16.0
[0.15.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.15.0...v0.15.1
[0.15.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.14.1...v0.15.0
[0.14.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.14.0...v0.14.1
[0.14.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.13.1...v0.14.0
[0.13.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.13.0...v0.13.1
[0.13.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.12.0...v0.13.0
[0.12.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.11.1...v0.12.0
[0.11.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.11.0...v0.11.1
[0.11.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.10.1...v0.11.0
[0.10.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.10.0...v0.10.1
[0.10.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.9.1...v0.10.0
[0.9.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.9.0...v0.9.1
[0.9.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.8.0...v0.9.0
[0.8.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.7.3...v0.8.0
[0.7.3]: https://github.com/RazrFalcon/roxmltree/compare/v0.7.2...v0.7.3
[0.7.2]: https://github.com/RazrFalcon/roxmltree/compare/v0.7.1...v0.7.2
[0.7.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.7.0...v0.7.1
[0.7.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.6.1...v0.7.0
[0.6.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.6.0...v0.6.1
[0.6.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.5.0...v0.6.0
[0.5.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.4.1...v0.5.0
[0.4.1]: https://github.com/RazrFalcon/roxmltree/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.3.0...v0.4.0
[0.3.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/RazrFalcon/roxmltree/compare/v0.1.0...v0.2.0
