don't match nested end tags with the same name

This commit is contained in:
Tom Dohrmann 2021-12-06 17:21:26 +01:00
parent d469128a48
commit 5141abaf85
3 changed files with 48 additions and 2 deletions

View File

@ -231,3 +231,49 @@ fn flatten_attribute_and_child() {
serialize_and_validate!(model, content);
deserialize_and_validate!(content, model, Node);
}
#[test]
fn flatten_name_in_unknown_child() {
init();
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
pub struct Node {
#[yaserde(flatten)]
base: Base,
#[yaserde(child)]
value: Value,
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct Base {
#[yaserde(attribute)]
id: String,
}
#[derive(PartialEq, Debug, YaDeserialize, YaSerialize)]
enum Value {
Foo(FooStruct),
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct FooStruct {}
impl Default for Value {
fn default() -> Self {
Self::Foo(FooStruct::default())
}
}
let model = Node {
base: Base {
id: "Foo".to_owned(),
},
value: Value::default(),
};
let content = r#"<Node id="Foo"><value><Foo /></value></Node>"#;
serialize_and_validate!(model, content);
let content = r#"<Node id="Foo"><value><SomethingThatDoesntExist><value></value></SomethingThatDoesntExist></value></Node>"#;
deserialize_and_validate!(content, model, Node);
}

View File

@ -66,7 +66,7 @@ pub fn parse(
}
}
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
if name.local_name == named_element {
if name.local_name == named_element && reader.depth() == start_depth + 1 {
break;
}
let _root = reader.next_event();

View File

@ -401,7 +401,7 @@ pub fn parse(
depth += 1;
}
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
if name.local_name == named_element {
if name.local_name == named_element && reader.depth() == start_depth + 1 {
#write_unused
break;
}