Release checklist (minimal list of actions for cutting a release):
$env:RUSTDOCFLAGS="--cfg docsrs"; cargo +nightly doc --all-features
and check generated documentation for missing / unclear things- Update version in
Cargo.toml
- Update
Changelog.md
with date of release, add new empty Unreleased headings- Commit changes with message "Release x.y.z"
cargo package
for final check- Push
master
to my fork, wait while CI pass. Repeat with force pushs if necessarycargo publish
- Create and push tag
vx.y.z
and pushmaster
to upstream- Create a Release on GitHub (in GitHub UI)
- #831: Add
BytesCData::escaped()
fn to construct CDATA events from arbitrary user input.
- #826: Implement
From<String>
andFrom<Cow<str>>
forquick_xml::de::Text
. - #826: Make
SimpleTypeDeserializer
andSimpleTypeSerializer
public. - #826: Implement
IntoDeserializer
for&mut Deserializer
.
- #655: Do not write indent before and after
$text
fields and those$value
fields that are serialized as a text (for example,usize
orString
). - #826: Handle only those boolean representations that are allowed by Xml Schema
which is only
"true"
,"1"
,"false"
, and"0"
. Previously the following values also was accepted:bool
XML content true
"True"
,"TRUE"
,"t"
,"Yes"
,"YES"
,"yes"
,"y"
false
"False"
,"FALSE"
,"f"
,"No"
,"NO"
,"no"
,"n"
- #227: Split
SeError
fromDeError
in theserialize
feature. Serialize functions and methods now returnSeError
. - #810: Return
std::io::Error
fromWriter
methods. - #811: Split
NamespaceError
andEncodingError
fromError
. - #811: Renamed
Error::EscapeError
toError::Escape
to match other variants. - #811: Narrow down error return type from
Error
where only one variant is ever returned: attribute related methods onBytesStart
andBytesDecl
returnsAttrError
- #820: Classify output of the
Serializer
by returning an enumeration with kind of written data - #823: Do not allow serialization of consequent primitives, for example
Vec<usize>
orVec<String>
in$value
fields. They cannot be deserialized back with the same result - #827: Make
escape
and it variants take aimpl Into<Cow<str>>
argument and implementFrom<(&'a str, Cow<'a, str>)>
onAttribute
- #826: Removed
DeError::InvalidInt
,DeError::InvalidFloat
andDeError::InvalidBoolean
. Now the responsibility for returning the error lies with the visitor of the type. See rationale in serde-rs/serde#2811
- #533: Fix incorrect DocType closing bracket detection when parsing with buffered reader
- #623: Added
Reader::stream()
that can be used to read arbitrary data from the inner reader while track position for XML reader.
- #781: Fix conditions to start CDATA section. Only uppercase
<![CDATA[
can start it. Previously any case was allowed. - #780: Fixed incorrect
.error_position()
when encountering syntax error for open or self-closed tag.
- #780:
reader::Parser
,reader::ElementParser
andreader::PiParser
moved to the new moduleparser
. - #776: Allow to have attributes in the end tag for compatibility reasons with Adobe Flash XML parser.
- #772: Add
reader::Config::allow_unmatched_ends
to permit dangling end tags
- #773: Fixed reporting incorrect end position in
Reader::read_to_end
family of methods and trimming of the trailing spaces inReader::read_text
whentrim_text_start
is set and the last event is not aText
event. - #771: Character references now allow any number of leading zeroes as it should.
As a result, the following variants of
quick_xml::escape::EscapeError
are removed:TooLongDecimal
TooLongHexadecimal
- #771: Fixed
Attribute::unescape_value
which does not unescape predefined values since 0.32.0. - #774: Fixed regression since 0.33.0:
Text
event may be skipped inread_event_into()
andread_event_into_async()
in some circumstances.
- #771:
EscapeError::UnrecognizedSymbol
renamed toEscapeError::UnrecognizedEntity
. - #771: Implemented
PartialEq
forEscapeError
. - #771: Replace the following variants of
EscapeError
byInvalidCharRef
variant with a newParseCharRefError
inside:EntityWithNull
InvalidDecimal
InvalidHexadecimal
InvalidCodepoint
- #751: Fix internal overflow when read 4GB+ files on 32-bit targets using
Reader<impl BufRead>
readers.
- #760:
Attribute::decode_and_unescape_value
andAttribute::decode_and_unescape_value_with
now acceptsDecoder
instead ofReader
. UseReader::decoder()
to get it. - #760:
Writer::write_event
now consumes event. UseEvent::borrow()
if you want to keep ownership. - #751: Type of
Reader::error_position()
andReader::buffer_position()
changed fromusize
tou64
. - #751: Type alias
Span
changed fromRange<usize>
toRange<u64>
.
- #758: Implemented
From<QName>
forBytesStart
andBytesEnd
.
- #755: Fix incorrect missing of trimming all-space text events when
trim_text_start = false
andtrim_text_end = true
.
- #650: Change the type of
Event::PI
to a new dedicatedBytesPI
type. - #759: Make
const
as much functions as possible:resolve_html5_entity()
resolve_predefined_entity()
resolve_xml_entity()
Attr::key()
Attr::value()
Attributes::html()
Attributes::new()
BytesDecl::from_start()
Decoder::encoding()
Deserializer::get_ref()
IoReader::get_ref()
LocalName::into_inner()
Namespace::into_inner()
NsReader::config()
NsReader::prefixes()
Prefix::into_inner()
QName::into_inner()
Reader::buffer_position()
Reader::config()
Reader::decoder()
Reader::error_position()
Reader::get_ref()
SliceReader::get_ref()
Writer::get_ref()
Writer::new()
- #763: Hide
quick_xml::escape::resolve_html5_entity
underescape-html
feature again. This function has significant influence to the compilation time (10+ seconds or 5x times)
The way to configure parser is changed. Now all configuration is contained in the
Config
struct and can be applied at once. When serde-types
feature is enabled,
configuration is serializable.
The method of reporting positions of errors has changed - use error_position()
to get an offset of the error position. For SyntaxError
s the range
error_position()..buffer_position()
also will represent a span of error.
The way of resolve entities with unescape_with
are changed. Those methods no longer
resolve predefined entities.
- #513: Allow to continue parsing after getting new
Error::IllFormed
. - #677: Added methods
config()
andconfig_mut()
to inspect and change the parser configuration. Previous builder methods onReader
/NsReader
was replaced by direct access to fields of config usingreader.config_mut().<...>
. - #684: Added a method
Config::enable_all_checks
to turn on or off all well-formedness checks. - #362: Added
escape::minimal_escape()
which escapes only&
and<
. - #362: Added
BytesCData::minimal_escape()
which escapes only&
and<
. - #362: Added
Serializer::set_quote_level()
which allow to set desired level of escaping. - #705: Added
NsReader::prefixes()
to list all the prefixes currently declared. - #629: Added a default case to
impl_deserialize_for_internally_tagged_enum
macro so that it can handle every attribute that does not match existing cases within an enum variant. - #722: Allow to pass owned strings to
Writer::create_element
. This is breaking change! - #275: Added
ElementWriter::new_line()
which enables pretty printing elements with multiple attributes. - #743: Added
Deserializer::get_ref()
to get XML Reader from serde Deserializer - #734: Added helper functions to resolve predefined XML and HTML5 entities:
quick_xml::escape::resolve_predefined_entity
quick_xml::escape::resolve_xml_entity
quick_xml::escape::resolve_html5_entity
- #753: Added parser for processing instructions:
quick_xml::reader::PiParser
. - #754: Added parser for elements:
quick_xml::reader::ElementParser
.
- #622: Fix wrong disregarding of not closed markup, such as lone
<
. - #684: Fix incorrect position reported for
Error::IllFormed(DoubleHyphenInComment)
. - #684: Fix incorrect position reported for
Error::IllFormed(MissingDoctypeName)
. - #704: Fix empty tags with attributes not being expanded when
expand_empty_elements
is set to true. - #683: Use local tag name when check tag name against possible names for field.
- #753: Correctly determine end of processing instructions and XML declaration.
- #675: Minimum supported version of serde raised to 1.0.139
- #675: Rework the
quick_xml::Error
type to provide more accurate information:Error::EndEventMismatch
replaced byIllFormedError::MismatchedEndTag
in some casesError::EndEventMismatch
replaced byIllFormedError::UnmatchedEndTag
in some casesError::TextNotFound
was removed because not usedError::UnexpectedBang
replaced bySyntaxError
Error::UnexpectedEof
replaced bySyntaxError
in some casesError::UnexpectedEof
replaced byIllFormedError
in some casesError::UnexpectedToken
replaced byIllFormedError::DoubleHyphenInComment
Error::XmlDeclWithoutVersion
replaced byIllFormedError::MissingDeclVersion
(in #684)Error::EmptyDocType
replaced byIllFormedError::MissingDoctypeName
(in #684)
- #684: Changed positions reported for
SyntaxError
s: now they are always points to the start of markup (i. e. to the<
character) with error. Useerror_position()
for that. - #684: Now
<??>
parsed asEvent::PI
with empty content instead of raising syntax error. - #684: Now
<?xml?>
parsed asEvent::Decl
instead ofEvent::PI
. - #362: Now default quote level is
QuoteLevel::Partial
when using serde serializer. - #689:
buffer_position()
now always report the position the parser last seen. To get an error position useerror_position()
. - #738: Add an example of how to deserialize XML elements into Rust enums using an intermediate custom deserializer.
- #748: Implement
Clone
forDeEvent
,PayloadEvent
andText
. - #734: Rename
NoEntityResolver
toPredefinedEntityResolver
. - #734: No longer resolve predefined entities (
lt
,gt
,apos
,quot
,amp
) inunescape_with
family of methods. You should do that by yourself using the methods listed above.
MSRV bumped to 1.56! Crate now uses Rust 2021 edition.
Enum representation was changed (it was buggy anyway) to ensure compatibility with serde >= 1.0.181
- #545: Resolve well-known namespaces (
xml
andxmlns
) to their appropriate URIs. Also, enforce namespace constraints related to these well-known namespaces. - #635: Add support for async
ElementWriter
operations.
- #660: Fixed incorrect deserialization of
xs:list
s from empty tags (<tag/>
or<tag></tag>
). Previously anDeError::UnexpectedEof")
was returned in that case - #580: Fixed incorrect deserialization of vectors of newtypes from sequences of tags.
- #661: More string handling of serialized primitive values (booleans, numbers, strings,
unit structs, unit variants).
<int>123<something-else/></int>
is no longer valid content. Previously all data after123
up to closing tag would be silently skipped. - #567: Fixed incorrect deserialization of vectors of enums from sequences of tags.
- #671: Fixed deserialization of empty
simpleType
s (for example, attributes) intoOption
fields: now they are always deserialized asSome("")
.
- #643: Bumped MSRV to 1.56. In practice the previous MSRV was incorrect in many cases.
- #643: Adopted Rust 2021 edition.
- #545: Added new
Error
variant --Error::InvalidPrefixBind
. - #651: Relax requirement for version of
arbitrary
dependency -- we're actually compatible with version 1.0.0 and up. - #649: Make features linkable and reference them in the docs.
- #619: Allow to raise application errors in
ElementWriter::write_inner_content
(and newly addedElementWriter::write_inner_content_async
of course). - #662: Get rid of some allocations during serde deserialization.
- #665: Improve serialization of
xs:list
s when some elements serialized to an empty string. - #630: Fixed compatibility with serde >= 1.0.181
- #609: Added
Writer::write_serializable
to provide the capability to serialize arbitrary types using serde when using the lower-levelWriter
API. - #615: Added ability to set entity resolver when deserialize using borrowing reader.
- #617: Added ability to enforce the expansion of empty elements.
- #604: Avoid crashing on wrong comments like
<!-->
when usingread_event_into*
functions.
- #601: Add
serde_helper
module to the crate root with some useful utility functions and document using of enum's unit variants as a text content of element. - #606: Implement indentation for
AsyncWrite
trait implementations.
- #603: Fix a regression from #581 that an XML comment or a processing
instruction between a <!DOCTYPE> and the root element in the file broke
deserialization of structs by returning
DeError::ExpectedStart
- #608: Return a new error
Error::EmptyDocType
on empty doctype instead of crashing because of a debug assertion.
- #594: Add a helper macro to help deserialize internally tagged enums with Serde, which doesn't work out-of-the-box due to serde limitations.
- #581: Allow
Deserializer
to setquick_xml::de::EntityResolver
for resolving unknown entities that would otherwise cause the parser to return an [EscapeError::UnrecognizedSymbol
] error.
- #584: Export
EscapeError
from the crate - #581: Relax requirements for
unsescape_*
set of functions -- their now useFnMut
instead ofFn
forresolve_entity
parameters, likeIterator::map
fromstd
.
- #579:
ElementWriter.write_inner_content
now uses aFnOnce
instead of a more restrictiveFn
closure
- #541: (De)serialize specially named
$text
enum variant in externally tagged enums to / from textual content - #556:
to_writer
andto_string
now accept?Sized
types - #556: Add new
to_writer_with_root
andto_string_with_root
helper functions - #520: Add methods
BytesText::inplace_trim_start
andBytesText::inplace_trim_end
to trim leading and trailing spaces from text events - #565: Allow deserialize special field names
$value
and$text
into borrowed fields when use serde deserializer - #568: Rename
Writer::inner
intoWriter::get_mut
- #568: Add method
Writer::get_ref
- #569: Rewrite the
Reader::read_event_into_async
as an async fn, making the futureSend
if possible. - #571: Borrow element names (
<element>
) when deserialize with serde. This change allow to deserialize intoHashMap<&str, T>
, for example - #573: Add basic support for async byte writers via tokio's
AsyncWrite
.
- #537: Restore ability to deserialize attributes that represents XML namespace
mappings (
xmlns:xxx
) that was broken since #490 - #510: Fix an error of deserialization of
Option<T>
fields whereT
is some sequence type (for example,Vec
or tuple) - #540: Fix a compilation error (probably a rustc bug) in some circumstances.
Serializer::new
andSerializer::with_root
now accepts only references toWrite
r. - #520: Merge consequent (delimited only by comments and processing instructions)
texts and CDATA when deserialize using serde deserializer.
DeEvent::Text
andDeEvent::CData
events was replaced byDeEvent::Text
with merged content. The same behavior for theReader
does not implemented (yet?) and should be implemented manually - #562: Correctly set minimum required version of memchr dependency to 2.1
- #565: Correctly set minimum required version of tokio dependency to 1.10
- #565: Fix compilation error when build with serde <1.0.139
- #530: Fix an infinite loop leading to unbounded memory consumption that occurs when
skipping events on malformed XML with the
overlapped-lists
feature active. - #530: Fix an error in the
Deserializer::read_to_end
whenoverlapped-lists
feature is active and malformed XML is parsed
- #521: Implement
Clone
for all error types. This required changingError::Io
to containArc<std::io::Error>
instead ofstd::io::Error
sincestd::io::Error
does not implementClone
.
- #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 - #500: Fix deserialization of top-level sequences of enums, like
<?xml version="1.0" encoding="UTF-8"?> <!-- list of enum Enum { A, B, С } --> <A/> <B/> <C/>
- #514: Fix wrong reporting
Error::EndEventMismatch
after disabling and enabling.check_end_names
- #517: Fix swapped codes for
\r
and\n
characters when escaping them - #523: Fix incorrect skipping text and CDATA content before any map-like structures
in serde deserializer, like
unwanted text<struct>...</struct>
- #523: Fix incorrect handling of
xs:list
s with encoded spaces: they still act as delimiters, which is confirmed also by mature XmlBeans Java library - #473: Fix a hidden requirement to enable serde's
derive
feature to get quick-xml'sserialize
feature foredition = 2021
orresolver = 2
crates
-
#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.
-
#521: MSRV bumped to 1.52.
-
#473:
serde
feature that used to make some types serializable, renamed toserde-types
-
#528: Added documentation for XML to
serde
mapping
- #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)
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
- #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