Skip to content

Commit a5da628

Browse files
authored
Merge pull request #437 from Mingun/namespaces
Split out namespace aware reader to a struct that manage the internal namespaces buffer
2 parents ebbcce0 + 45be217 commit a5da628

10 files changed

+1645
-996
lines changed

Changelog.md

+12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@
2727
the XML declared encoding and always use UTF-8
2828
- [#416]: Add `borrow()` methods in all event structs which allows to get
2929
a borrowed version of any event
30+
- [#437]: Split out namespace reading functionality to a dedicated `NsReader`, namely:
31+
|Old function in `Reader`|New function in `NsReader`
32+
|------------------------|--------------------------
33+
| |`read_event` -- borrow from input
34+
| |`read_resolved_event` -- borrow from input
35+
| |`read_event_into`
36+
|`read_namespaced_event` |`read_resolved_event_into`
37+
| |`resolve`
38+
|`event_namespace` |`resolve_element`
39+
|`attribute_namespace` |`resolve_attribute`
40+
3041

3142
### Bug Fixes
3243

@@ -167,6 +178,7 @@
167178
[#418]: https://github.com/tafia/quick-xml/pull/418
168179
[#421]: https://github.com/tafia/quick-xml/pull/421
169180
[#423]: https://github.com/tafia/quick-xml/pull/423
181+
[#437]: https://github.com/tafia/quick-xml/pull/437
170182

171183
## 0.23.0 -- 2022-05-08
172184

benches/microbenches.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use pretty_assertions::assert_eq;
33
use quick_xml::escape::{escape, unescape};
44
use quick_xml::events::Event;
55
use quick_xml::name::QName;
6-
use quick_xml::Reader;
6+
use quick_xml::{NsReader, Reader};
77

88
static SAMPLE: &[u8] = include_bytes!("../tests/documents/sample_rss.xml");
99
static PLAYERS: &[u8] = include_bytes!("../tests/documents/players.xml");
@@ -73,19 +73,18 @@ fn read_event(c: &mut Criterion) {
7373
group.finish();
7474
}
7575

76-
/// Benchmarks the `Reader::read_namespaced_event` function with all XML well-formless
76+
/// Benchmarks the `NsReader::read_resolved_event_into` function with all XML well-formless
7777
/// checks disabled (with and without trimming content of #text nodes)
78-
fn read_namespaced_event(c: &mut Criterion) {
79-
let mut group = c.benchmark_group("read_namespaced_event");
78+
fn read_resolved_event_into(c: &mut Criterion) {
79+
let mut group = c.benchmark_group("NsReader::read_resolved_event_into");
8080
group.bench_function("trim_text = false", |b| {
8181
b.iter(|| {
82-
let mut r = Reader::from_reader(SAMPLE);
82+
let mut r = NsReader::from_bytes(SAMPLE);
8383
r.check_end_names(false).check_comments(false);
8484
let mut count = criterion::black_box(0);
8585
let mut buf = Vec::new();
86-
let mut ns_buf = Vec::new();
8786
loop {
88-
match r.read_namespaced_event(&mut buf, &mut ns_buf) {
87+
match r.read_resolved_event_into(&mut buf) {
8988
Ok((_, Event::Start(_))) | Ok((_, Event::Empty(_))) => count += 1,
9089
Ok((_, Event::Eof)) => break,
9190
_ => (),
@@ -101,15 +100,14 @@ fn read_namespaced_event(c: &mut Criterion) {
101100

102101
group.bench_function("trim_text = true", |b| {
103102
b.iter(|| {
104-
let mut r = Reader::from_reader(SAMPLE);
103+
let mut r = NsReader::from_bytes(SAMPLE);
105104
r.check_end_names(false)
106105
.check_comments(false)
107106
.trim_text(true);
108107
let mut count = criterion::black_box(0);
109108
let mut buf = Vec::new();
110-
let mut ns_buf = Vec::new();
111109
loop {
112-
match r.read_namespaced_event(&mut buf, &mut ns_buf) {
110+
match r.read_resolved_event_into(&mut buf) {
113111
Ok((_, Event::Start(_))) | Ok((_, Event::Empty(_))) => count += 1,
114112
Ok((_, Event::Eof)) => break,
115113
_ => (),
@@ -393,7 +391,7 @@ purus. Consequat id porta nibh venenatis cras sed felis.";
393391
criterion_group!(
394392
benches,
395393
read_event,
396-
read_namespaced_event,
394+
read_resolved_event_into,
397395
one_event,
398396
attributes,
399397
escaping,

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,5 @@ mod writer;
6565
#[cfg(feature = "serialize")]
6666
pub use crate::errors::serialize::DeError;
6767
pub use crate::errors::{Error, Result};
68-
pub use crate::reader::{Decoder, Reader};
68+
pub use crate::reader::{Decoder, NsReader, Reader};
6969
pub use crate::writer::{ElementWriter, Writer};

src/name.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,15 @@ impl<'a> AsRef<[u8]> for Namespace<'a> {
274274

275275
////////////////////////////////////////////////////////////////////////////////////////////////////
276276

277-
/// Result of [prefix] resolution which creates by [`Reader::attribute_namespace`],
278-
/// [`Reader::event_namespace`] and [`Reader::read_namespaced_event`] methods.
277+
/// Result of [prefix] resolution which creates by [`NsReader::resolve_attribute`],
278+
/// [`NsReader::resolve_element`], [`NsReader::read_resolved_event`] and
279+
/// [`NsReader::read_resolved_event_into`] methods.
279280
///
280281
/// [prefix]: Prefix
281-
/// [`Reader::attribute_namespace`]: crate::reader::Reader::attribute_namespace
282-
/// [`Reader::event_namespace`]: crate::reader::Reader::event_namespace
283-
/// [`Reader::read_namespaced_event`]: crate::reader::Reader::read_namespaced_event
282+
/// [`NsReader::resolve_attribute`]: crate::reader::NsReader::resolve_attribute
283+
/// [`NsReader::resolve_element`]: crate::reader::NsReader::resolve_element
284+
/// [`NsReader::read_resolved_event`]: crate::reader::NsReader::read_resolved_event
285+
/// [`NsReader::read_resolved_event_into`]: crate::reader::NsReader::read_resolved_event_into
284286
#[derive(Clone, PartialEq, Eq, Hash)]
285287
pub enum ResolveResult<'ns> {
286288
/// Qualified name does not contain prefix, and resolver does not define

0 commit comments

Comments
 (0)