Legend:
- feat: A new feature
- fix: A bug fix
- docs: Documentation only changes
- style: White-space, formatting, missing semi-colons, etc
- refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance
- test: Adding missing tests
- chore: Changes to the build process or auxiliary tools/libraries/documentation
- #490: Ensure that serialization of map keys always produces valid XML names.
In particular, that means that maps with numeric and numeric-like keys (for
example,
"42"
) no longer can be serialized because XML name cannot start from a digit
-
#490: Removed
$unflatten=
special prefix for fields for serde (de)serializer, because:- it is useless for deserializer
- serializer was rewritten and does not require it anymore
This prefix allowed you to serialize struct field as an XML element and now replaced by a more thoughtful system explicitly indicating that a field should be serialized as an attribute by prepending
@
character to its name -
#490: Removed
$primitive=
prefix. That prefix allowed you to serialize struct field as an attribute instead of an element and now replaced by a more thoughtful system explicitly indicating that a field should be serialized as an attribute by prepending@
character to its name -
#490: In addition to the
$value
special name for a field a new$text
special name was added:$text
is used if you want to map field to text content only. No markup is expected (but text can represent a list as defined byxs:list
type)$value
is used if you want to map elements with different names to one field, that should be represented either by anenum
, or by sequence ofenum
s (Vec
, tuple, etc.), or by string. Use it when you want to map field to any content of the field, text or markup
Refer to documentation for details.
- #481: Removed the uses of
const fn
added in version 0.24 in favor of a lower minimum supported Rust version (1.46.0). Minimum supported Rust version is now verified in the CI. - #489: Reduced the size of the package uploaded into the crates.io by excluding tests, examples, and benchmarks.
- #469: Fix incorrect parsing of CDATA and comments when using buffered readers
- #468: Content of
DeError::Unsupported
changed from&'static str
toCow<'static, str>
- #468: Ensure that map keys are restricted to only types that can be serialized as primitives
- #469: Fix incorrect parsing of CDATA and comments when using buffered readers
- #387: Allow overlapping between elements of sequence and other elements
(using new feature
overlapped-lists
) - #393: New module
name
withQName
,LocalName
,Namespace
,Prefix
andPrefixDeclaration
wrappers around byte arrays andResolveResult
with the result of namespace resolution - #180: Make
Decoder
struct public. You already had access to it via theReader::decoder()
method, but could not name it in the code. Now the preferred way to access decoding functionality is via this struct - #395: Add support for XML Schema
xs:list
- #324:
Reader::from_str
/Deserializer::from_str
/from_str
now ignore the XML declared encoding and always use UTF-8 - #416: Add
borrow()
methods in all event structs which allows to get a borrowed version of any event - #437: Split out namespace reading functionality to a dedicated
NsReader
, namely:Old function in Reader
New function in NsReader
read_event
-- borrow from inputread_resolved_event
-- borrow from inputread_event_into
read_namespaced_event
read_resolved_event_into
resolve
event_namespace
resolve_element
attribute_namespace
resolve_attribute
- #439: Added utilities
detect_encoding()
anddecode()
under thequick-xml::encoding
namespace. - #450: Added support of asynchronous tokio readers
- #455: Change return type of all
read_to_end*
methods to return a span between tags - #455: Added
Reader::read_text
method to return a raw content (including markup) between tags - #459: Added a
Writer::write_bom()
method for inserting a Byte-Order-Mark into the document. - #467: The following functions made
const
:Attr::key
Attr::value
Attributes::html
Attributes::new
BytesDecl::from_start
Decoder::encoding
LocalName::into_inner
Namespace::into_inner
Prefix::into_inner
QName::into_inner
Reader::buffer_position
Reader::decoder
Reader::get_ref
Serializer::new
Serializer::with_root
Writer::new
- #9: Deserialization erroneously was successful in some cases where error is expected. This broke deserialization of untagged enums which rely on error if variant cannot be parsed
- #387: Allow to have an ordinary elements together with a
$value
field - #387: Internal deserializer state can be broken when deserializing a map with
a sequence field (such as
Vec<T>
), where elements of this sequence contains another sequence. This error affects only users with theserialize
feature enabled - #393: Now
event_namespace
,attribute_namespace
andread_event_namespaced
returnsResolveResult::Unknown
if prefix was not registered in namespace buffer - #393: Fix breaking processing after encounter an attribute with a reserved name (started with "xmlns")
- #363: Do not generate empty
Event::Text
events - #412: Fix using incorrect encoding if
read_to_end
family of methods orread_text
method not found a corresponding end tag and reader has non-UTF-8 encoding - #421: Fix incorrect order of unescape and decode operations for serde deserializer: decoding should be first, unescape is the second
- #421: Fixed unknown bug in serde deserialization of externally tagged enums
when an enum variant represented as a
Text
event (i.e.<xml>tag</xml>
) and a document encoding is not an UTF-8 - #434: Fixed incorrect error generated in some cases by serde deserializer
- #445: Use local name without namespace prefix when selecting enum variants based on element names in a serde deserializer
-
#8: Changes in the error type
DeError
:Variant Change DeError::Text
Removed because never raised DeError::InvalidEnum
Removed because never raised DeError::Xml
Renamed to DeError::InvalidXml
for consistency withDeError::InvalidBoolean
DeError::Int
Renamed to DeError::InvalidInt
for consistency withDeError::InvalidBoolean
DeError::Float
Renamed to DeError::InvalidFloat
for consistency withDeError::InvalidBoolean
DeError::Start
Renamed to DeError::UnexpectedStart
and tag name added to an errorDeError::End
Renamed to DeError::UnexpectedEnd
and tag name added to an errorDeEvent::Eof
Renamed to DeError::UnexpectedEof
DeError::EndOfAttributes
Renamed to DeError::KeyNotFound
DeError::ExpectedStart
Added -
#391: Added code coverage
-
#393:
event_namespace
andattribute_namespace
now acceptQName
and returnsResolveResult
andLocalName
,read_event_namespaced
now returnsResolveResult
instead ofOption<[u8]>
-
#393: Types of
Attribute::key
andAttr::key()
changed toQName
-
#393: Now
BytesStart::name()
andBytesEnd::name()
returnsQName
, andBytesStart::local_name()
andBytesEnd::local_name()
returnsLocalName
-
#191: Remove unused
reader.decoder().decode_owned()
. If you ever used it, useString::from_utf8
instead (which that function did) -
#191: Remove
*_without_bom
methods from theAttributes
struct because they are useless. Use the same-named methods without that suffix instead. Attribute values cannot contain BOM -
#191: Remove
Reader::decode()
andReader::decode_without_bom()
, they are replaced byDecoder::decode()
and nothing. Usereader.decoder().decode_*(...)
instead ofreader.decode_*(...)
for now.Reader::encoding()
is replaced byDecoder::encoding()
as well -
#180: Eliminated the differences in the decoding API when feature
encoding
enabled and when it is disabled. Signatures of functions are now the same regardless of whether or not the feature is enabled, and an error will be returned instead of performing replacements for invalid characters in both cases.Previously, if the
encoding
feature was enabled, decoding functions would returnResult<Cow<&str>>
while without this feature they would returnResult<&str>
. With this change, onlyResult<Cow<&str>>
is returned regardless of the status of the feature. -
#180: Error variant
Error::Utf8
replaced byError::NonDecodable
-
#118: Remove
BytesStart::unescaped*
set of methods because they could return wrong results Use methods onAttribute
instead -
#403: Remove deprecated
quick_xml::de::from_bytes
andDeserializer::from_borrowing_reader
-
#412: Rename methods of
Reader
:Old Name New Name read_event
read_event_into
read_to_end
read_to_end_into
read_text
read_text_into
read_event_unbuffered
read_event
read_to_end_unbuffered
read_to_end
-
#412: Change
read_to_end*
andread_text_into
to acceptQName
instead ofAsRef<[u8]>
-
#415: Changed custom entity unescaping API to accept closures rather than a mapping of entity to replacement text. This avoids needing to allocate a map and provides the user with more flexibility.
-
#415: Renamed functions for consistency across the API:
Old Name New Name *_with_custom_entities
*_with
BytesText::unescaped()
BytesText::unescape()
Attribute::unescaped_*
Attribute::unescape_*
-
#329: Also, that functions now borrow from the input instead of event / attribute
-
#416:
BytesStart::to_borrowed
renamed toBytesStart::borrow
, the same method added to all events -
#421:
decode_and_unescape*
methods now does one less allocation if unescaping is not required -
#421: Removed ability to deserialize byte arrays from serde deserializer. XML is not able to store binary data directly, you should always use some encoding scheme, for example, HEX or Base64
-
#421: All unescaping functions now accepts and returns strings instead of byte slices
-
#423: All escaping functions now accepts and returns strings instead of byte slices
-
#423: Removed
BytesText::from_plain
because it internally did escaping of a byte array, but since now escaping works on strings. UseBytesText::new
instead -
#428: Removed
BytesText::escaped()
. Use.as_ref()
provided byDeref
impl instead. -
#428: Removed
BytesText::from_escaped()
. Use constructors from strings instead, because writer anyway works in UTF-8 only -
#428: Removed
BytesCData::new()
. Use constructors from strings instead, because writer anyway works in UTF-8 only -
#428: Changed the event and
Attributes
constructors to accept a&str
slices instead of&[u8]
slices. Handmade events has always been assumed to store their content UTF-8 encoded. -
#428: Removed
Decoder
parameter from_and_decode
versions of functions forBytesText
(remember, that those functions was renamed in #415). -
#431: Changed event constructors:
Old names New name BytesStart::owned_name(impl Into<Vec<u8>>)
BytesStart::new(impl Into<Cow<str>>)
BytesStart::borrowed_name(&[u8])
(as above) BytesStart::owned(impl Into<Vec<u8>>, usize)
BytesStart::from_content(impl Into<Cow<str>>, usize)
BytesStart::borrowed(&[u8], usize)
(as above) BytesEnd::owned(Vec<u8>)
BytesEnd::new(impl Into<Cow<str>>)
BytesEnd::borrowed(&[u8])
(as above) BytesText::from_escaped(impl Into<Cow<[u8]>>)
BytesText::from_escaped(impl Into<Cow<str>>)
BytesText::from_escaped_str(impl Into<Cow<str>>)
(as above) BytesText::from_plain(&[u8])
BytesText::new(&str)
BytesText::from_plain_str(&str)
(as above) BytesCData::new(impl Into<Cow<[u8]>>)
BytesCData::new(impl Into<Cow<str>>)
BytesCData::from_str(&str)
(as above) -
#440: Removed
Deserializer::from_slice
andquick_xml::de::from_slice
methods because deserializing from a byte array cannot guarantee borrowing due to possible copying while decoding. -
#455: Removed
Reader::read_text_into
which is just a thin wrapper over match onEvent::Text
-
#456: Reader and writer stuff grouped under
reader
andwriter
modules. You still can use re-exported definitions from a crate root -
#459: Made the
Writer::write()
method non-public as writing random bytes to a document is not generally useful or desirable. -
#459: BOM bytes are no longer emitted as
Event::Text
. To write a BOM, useWriter::write_bom()
. -
#467: Removed
Deserializer::new
because it cannot be used outside of the quick-xml crate
- #9: Added tests for incorrect nested tags in input
- #387: Added a bunch of tests for sequences deserialization
- #393: Added more tests for namespace resolver
- #393: Added tests for reserved names (started with "xml"i) -- see https://www.w3.org/TR/xml-names11/#xmlReserved
- #363: Add tests for
Reader::read_event_impl
to ensure that proper events generated for corresponding inputs - #407: Improved benchmark suite to cover whole-document parsing, escaping and unescaping text
- #418: Parameterized macrobenchmarks and comparative benchmarks, added throughput measurements via criterion
- #434: Added more tests for serde deserializer
- #443: Now all documents in
/tests/documents
are checked out with LF eol in working copy (except sample_5_utf16bom.xml)
- #469: Fix incorrect parsing of CDATA and comments when using buffered readers
- feat: add support for
i128
/u128
in attributes or text/CDATA content - test: add tests for malformed inputs for serde deserializer
- fix: allow to deserialize
unit
s from any data in attribute values and text nodes - refactor: unify errors when EOF encountered during serde deserialization
- test: ensure that after deserializing all XML was consumed
- feat: add
Deserializer::from_str
,Deserializer::from_slice
andDeserializer::from_reader
- refactor: deprecate
from_bytes
andDeserializer::from_borrowing_reader
because they are fully equivalent tofrom_slice
andDeserializer::new
- refactor: reduce number of unnecessary copies when deserialize numbers/booleans/identifiers from the attribute and element names and attribute values
- fix: allow to deserialize
unit
s from text and CDATA content.DeError::InvalidUnit
variant is removed, because after fix it is no longer used - fix:
ElementWriter
, introduced in #274 (0.23.0-alpha2) now available to end users - fix: allow lowercase
<!doctype >
definition (used in HTML 5) when parse document from&[u8]
- test: add tests for consistence behavior of buffered and borrowed readers
- fix: produce consistent error positions in buffered and borrowed readers
- feat:
Error::UnexpectedBang
now provide the byte found - refactor: unify code for buffered and borrowed readers
- fix: fix internal panic message when parse malformed XML (#344)
- test: add tests for trivial documents (empty / only comment /
<root>...</root>
-- one tag with content) - fix: CDATA was not handled in many cases where it should
- fix: do not unescape CDATA content because it never escaped by design.
CDATA event data now represented by its own
BytesCData
type (quick-xml#311) - feat: add
Reader::get_ref()
andReader::get_mut()
, renameReader::into_underlying_reader()
toReader::into_inner()
- refactor: now
Attributes::next()
returns a new typeAttrError
when attribute parsing failed (#4) - test: properly test all paths of attributes parsing (#4)
- feat: attribute iterator now implements
FusedIterator
(#4) - fix: fixed many errors in attribute parsing using iterator, returned from
attributes()
orhtml_attributes()
(#4)
- fix: use element name (with namespace) when unflattening (serialize feature)
- fix: failing tests with features
- style: convert to rust edition 2018
- fix: don't encode multi byte escape characters as big endian
- feat: add
Writer::write_nested_event
- feat: add
BytesStart::try_get_attribute
- test: add more test on github actions
- feat: allow unbuffered deserialization (!!)
- style: use edition 2018
- feat: add a function for partially escaping an element
- feat: higher level api to write xmls
- feat (breaking): Move html entity escape behind a
'escape-html'
feature to help with compilation - style: rustfmt
- feat: inline CData when pretty printing
- test: fix tests (Windows and Html5)
- feat (breaking): add
*_with_custom_entities
versions of all `unescape_*\ methods - test: more robust test for numeric entities
- refactor: add explicit pre-condition about custom_entities
- feat: Split text trim into start and end
- fix:
$value
rename should work the same for deserialization and serialization - docs: README.md: Replace dead benchmark link
- style: Cargo.toml: remove "readme" field
- fix: Parse & in cdata correctly
- style: Fix reader.rs typo
- feat: Accept html5 doctype
- fix: Unescape all existing HTML entities
- test: Add tests for indentation
- test: Add complete tests for serde deserialization
- feat: Use self-closed tags when serialize types without nested elements with serde
- feat: Add two new API to the
BytesStart
:to_borrowed()
andto_end()
- feat: Add ability to specify name of the root tag and indentation settings when serialize type with serde
- feat: Add support for serialization of
- unit enums variants
- newtype structs and enum variants
- unnamed tuples, tuple structs and enum variants
- fix: More consistent structs serialization
- fix: Deserialization of newtype structs
- fix:
unit
deserialization and newtype and struct deserialization in adjacently tagged enums
- docs: Add example for nested parsing
- fix:
buffer_position
not properly set sometimes - feat: Make escape module public apart from EscapeError
- feat: Nake Reader
Clone
able - feat: Enable writing manual indentation (and fix underflow on shrink)
- style: Forbid unsafe code
- fix: Use
write_all
instead ofwrite
- fix: (Serde) Serialize basic types as attributes (breaking change)
- test: Fix benchmarks on Windows and add trimmed variant
- feat: deserialize bytes
- feat: add
decode_without_bom
fns for BOM prefixed text fields - fix: decode then unescape instead of unescape and decode
- feat: add Seq to serializer
- docs: update readme with example for
$value
- feat: add new
serialize
feature to support serde serialize/deserialize
- perf: speed up (un)escape a little
- feat: remove failure completely (breaking change) and implement
std::error::Error
forError
- feat: improve
Debug
s forAttribute
,BytesStart
,BytesEnd
,BytesText
- refactor: remove derive_more dependency (used only in 2 structs)
- refactor: move xml-rs bench dependency into another local crate
- feat: (breaking change) set failure and encoding_rs crates as optional.
You should now use respectively
use-failure
andencoding
features to get the old behavior - perf: improve perf using memchr3 iterator. Reading is 18% better on benches
- feat: remove Seek bound
- style: rustfmt
- feat: make failure error crate optional. To revert back to old behavior, use the
--failure
feature.
- feat: allow changing name without deallocating
BytesStart
buffer - feat: add standard error type conversion
- fix: allow whitespace in End events
- feat: bump dependencies
- feat: Add into_underlying_reader method for
Reader<BufRead + Seek>
- feat: rename
resolve_namespace
intoattribute_namespace
- feat: add a
event_namespace
fn
- fix: Fix minor bug for parsing comment tag
- feat: add
BytesStart::{owned_name, borrowed_name}
- refactor: bump dependencies
- test: fix travis
- feat: enable
into_owned
for all events
- feat: rename BytesText fn to better clarify escape intents
- docs: various improvements!
- feat: migrate from error-chain to failure
- feat: allow html style attribute iterators
- feat: add optional identation on writer
- refactor: remove unecessary derive impl
- fix: overflow possibility when parsing Ascii codes
- feat: update dependencies
- doc: add doc for attribute creation functions
- fix: escape attributes
- fix: avoid double escapes
- fix: bound tests in
read_bang
fn.
- fix: escape was panicking at the 3rd character escaped.
- perf: update to encoding_rs 0.7.0, supposedly faster for utf8
- style: rustfmt-nightly
- perf: use memchr crate and rewrite some loops with iterators
- docs: remove duplicate
Reader
doc in lib.rs
- feat: add getter for encoding to reader
- feat: escape Text events on write (breaking change)
- feat: allow
Writer
to borrowEvent
(usingAsRef<Event>
)
- fix: make the reader borrow the namespace buffer so it can be used repetitively
- refactor: bump dependencies
- fix: fix Event::Text slice always starting at the beginning of the buffer
- perf: faster unescape method
- docs: update readme
- refactor bump encoding_rs to 0.6.6
- style: rustfmt
- refactor: remove from_ascii crate dependency
- style: rustfmt
- fix: {with,extend}_attributes usage
- feat: add naive
local_name
function
- fix: another overflow bug found with cargo-fuzz
- refactor: update dependencies
- fix: fix an overflow found with cargo-fuzz
Major refactoring. Breaks most of existing functionalities
- refactor: replace
XmlReader
with a non allocatingReader
(uses an external buffer) - refactor: replace
XmlnsReader
iterator by a simplerReader::read_namespaced_event
function - refactor: replace
UnescapedAttribute
with a newAttribute
struct withunescape
functions - feat: support xml decodings
- refactor: remove the
AsStr
trait: user must useunescape_and_decode
fns when necessary (alternatively, rununescape
and/orReader::decode
) - refactor: module hierarchies
- refactor: replace
Element
s with several per event structsBytesStart
- perf: unescape: use from-ascii crate instead to get ascii codes without string validation
- refactor: rename
XmlWriter
toWriter
and provide a way to write&[u8]
directly - refactor: adds @vandenoever changes to save some namespaces allocations
- refactor: adds error-chain and remove
ResultPos
(user can still useReader::buffer_position
if needed)
- feat: apply default namespaces (
xmlns="..."
) to unqualified elements - fix: scope for namespace resolution on empty elements
- fix: parsing of
>
in attribute values
- feat: add
into_unescaped_string
- refactor: remove RustyXML benches
- docs: redirect to docs.rs for documentation
- docs: add examples in lib.rs
- feat: add
read_text_unescaped
- fix: fix tests
- fix: fix attributes with
=
character in their value - perf: inline some local functions
- feat: set default to
expand_empty_elements = true
- fix: fix all broken tests because of
Empty
events
- feat: Add support for
Empty
event
- test: add most tests from xml-rs crate
- fix: do not write attributes on
Event::End
- refactor: code refactoring, split largest functions into smaller ones
- refactor: use
Range
instead ofusize
s inElement
definition - docs: fix typo
- feat: add
Clone
to more structs - style: apply rustfmt
- refactor: change
from_str
into implFrom<&str>
- feat: support
Event::DocType
- feat: add
.check_comments
to check for invalid double dashes (--
) in comments - fix: check that all attributes are distincts
- feat: return more precise index when erroring
- feat: have
Attributes
iterate ResultPos instead ofResult
- feat: provide functions to unescape
&...;
characters (.escaped_content
and.escaped_attributes
) - fix: have namespace resolution start one level higher
- feat: add
XmlnsReader
to iterate event and resolve namespaces! - docs: better documentation (in particular regarding
Element
structure and design) - test: add benchmarks, with xml-rs for a reference
- feat/fix: add
Event::PI
to manage processing instructions (<?...?>
) - test: add test with a sample file
- feat: parse
Event::Decl
for xml declaration so we can haveversion
,encoding
... - refactor: rename
position
intobuffer_position
because it sometimes conflicted withIterator::position
- test: add test for buffer_position
- feat: add buffer position when erroring to help debuging (return
ResultPos
instead ofResult
) - test: add travis CI
- docs: add merrit badge and travis status
- feat: improve Element API with new, with_attributes, push_attribute
- feat: always return raw
&[u8]
and add aAsStr
trait for conversion
- feat: add helper functions
- feat: add
XmlWriter
to write/modify xmls - feat: use
AsRef<[u8]>
when possible
- test: add tests
- feat: add
with_check