diff --git a/yaserde/tests/flatten.rs b/yaserde/tests/flatten.rs
index 660fabc..cbd980d 100644
--- a/yaserde/tests/flatten.rs
+++ b/yaserde/tests/flatten.rs
@@ -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#""#;
+ serialize_and_validate!(model, content);
+
+ let content = r#""#;
+ deserialize_and_validate!(content, model, Node);
+}
diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs
index 757c015..0b7a97e 100644
--- a/yaserde_derive/src/de/expand_enum.rs
+++ b/yaserde_derive/src/de/expand_enum.rs
@@ -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();
diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs
index 4f5ba1f..592ae94 100644
--- a/yaserde_derive/src/de/expand_struct.rs
+++ b/yaserde_derive/src/de/expand_struct.rs
@@ -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;
}