Skip to content

Commit

Permalink
Merge pull request #603 from danjpgriffin/master
Browse files Browse the repository at this point in the history
Trim next element after DocType
  • Loading branch information
Mingun committed Jun 10, 2023
2 parents 5fc695e + d49f2d5 commit 358cc58
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Changelog.md
Expand Up @@ -18,9 +18,15 @@

### Bug Fixes

- [#603]: Fix a regression from [#581] that an XML comment or a processing
instruction between a <!DOCTYPE> and the root element in the file brokes
deserialization of structs by returning `DeError::ExpectedStart`

### Misc Changes

[#581]: https://github.com/tafia/quick-xml/pull/581
[#601]: https://github.com/tafia/quick-xml/pull/601
[#603]: https://github.com/tafia/quick-xml/pull/603
[#606]: https://github.com/tafia/quick-xml/pull/606


Expand Down
2 changes: 1 addition & 1 deletion src/de/mod.rs
Expand Up @@ -2880,7 +2880,7 @@ impl StartTrimmer {
#[inline(always)]
fn trim<'a>(&mut self, event: Event<'a>) -> Option<PayloadEvent<'a>> {
let (event, trim_next_event) = match event {
Event::DocType(e) => (PayloadEvent::DocType(e), false),
Event::DocType(e) => (PayloadEvent::DocType(e), true),
Event::Start(e) => (PayloadEvent::Start(e), true),
Event::End(e) => (PayloadEvent::End(e), true),
Event::Eof => (PayloadEvent::Eof, true),
Expand Down
74 changes: 74 additions & 0 deletions tests/serde-de.rs
Expand Up @@ -6496,3 +6496,77 @@ mod resolve {
);
}
}

/// Tests for https://github.com/tafia/quick-xml/pull/603.
///
/// According to <https://www.w3.org/TR/xml11/#NT-prolog> comments,
/// processing instructions and spaces are possible after XML declaration or DTD.
/// Their existence should not break deserializing
///
/// ```text
/// [22] prolog ::= XMLDecl Misc* (doctypedecl Misc*)?
/// [27] Misc ::= Comment | PI | S
/// ```
mod xml_prolog {
use super::*;
use pretty_assertions::assert_eq;
use std::collections::HashMap;

#[test]
fn spaces() {
assert_eq!(
from_str::<HashMap<(), ()>>(
r#"
<?xml version="1.1"?>
<!DOCTYPE dict>
<doc>
</doc>
"#
)
.unwrap(),
HashMap::new()
);
}

#[test]
fn comments() {
assert_eq!(
from_str::<HashMap<(), ()>>(
r#"
<?xml version="1.1"?>
<!-- comment between xml declaration and doctype -->
<!-- another comment -->
<!DOCTYPE dict>
<!-- comment between doctype and root element -->
<!-- another comment -->
<doc>
</doc>
"#,
)
.unwrap(),
HashMap::new()
);
}

#[test]
fn pi() {
assert_eq!(
from_str::<HashMap<(), ()>>(
r#"
<?xml version="1.1"?>
<?pi?>
<?another pi?>
<!DOCTYPE dict>
<?pi?>
<?another pi?>
<doc>
</doc>
"#,
)
.unwrap(),
HashMap::new()
);
}
}

0 comments on commit 358cc58

Please sign in to comment.