diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs
index 93e3889be7e24d..ef70627286ee8f 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReader.cs
@@ -893,15 +893,56 @@ protected XmlQualifiedName ReadElementQualifiedName()
if (wrapped)
{
if (ReadNull()) return null;
+
+ // Store element information before consuming it
+ string localName = _r.LocalName;
+ string namespaceURI = _r.NamespaceURI;
+ bool isEmpty = _r.IsEmptyElement;
+
+ // Store attributes if present
+ var attributes = new List<(string name, string namespaceUri, string value)>();
+ if (_r.HasAttributes)
+ {
+ while (_r.MoveToNextAttribute())
+ {
+ attributes.Add((_r.Name, _r.NamespaceURI, _r.Value));
+ }
+ _r.MoveToElement();
+ }
+
_r.ReadStartElement();
- _r.MoveToContent();
- if (_r.NodeType != XmlNodeType.EndElement)
- node = Document.ReadNode(_r);
- while (_r.NodeType != XmlNodeType.EndElement)
+
+ if (isEmpty)
{
- UnknownNode(null);
+ // For empty elements, create an empty XmlElement with attributes
+ var element = Document.CreateElement(localName, namespaceURI);
+ foreach (var (name, nsUri, value) in attributes)
+ {
+ element.SetAttribute(name, nsUri, value);
+ }
+ node = element;
+ }
+ else
+ {
+ _r.MoveToContent();
+ if (_r.NodeType != XmlNodeType.EndElement)
+ node = Document.ReadNode(_r);
+ else
+ {
+ // Element is empty (no content between start and end tags)
+ var element = Document.CreateElement(localName, namespaceURI);
+ foreach (var (name, nsUri, value) in attributes)
+ {
+ element.SetAttribute(name, nsUri, value);
+ }
+ node = element;
+ }
+ while (_r.NodeType != XmlNodeType.EndElement)
+ {
+ UnknownNode(null);
+ }
+ _r.ReadEndElement();
}
- _r.ReadEndElement();
}
else
{
diff --git a/src/libraries/System.Private.Xml/tests/System.Private.Xml.Tests.csproj b/src/libraries/System.Private.Xml/tests/System.Private.Xml.Tests.csproj
index 1ce5192ef4ad2d..5464e6455e36d9 100644
--- a/src/libraries/System.Private.Xml/tests/System.Private.Xml.Tests.csproj
+++ b/src/libraries/System.Private.Xml/tests/System.Private.Xml.Tests.csproj
@@ -434,6 +434,7 @@
test
test
", result.Description.InnerXml); + + // The Name should still be correctly deserialized + Assert.Equal("Test", result.Name); + } + + [Fact] + public static void XmlElement_EmptyElement_BehaviorConsistentWithNonEmpty() + { + var serializer = new XmlSerializer(typeof(RootWithXmlElement)); + + // Empty element case + var xml1 = @"