diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs index 66436843a79964..9c58ff5c545d06 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs @@ -696,13 +696,24 @@ private bool WriteMemberText(Member anyText) { if (anyTextMapping.TypeDesc!.IsArrayLike) { + string textValue; if (text.Mapping!.TypeDesc!.CollapseWhitespace) { - value = CollapseWhitespace(Reader.ReadString()); + textValue = CollapseWhitespace(Reader.ReadString()); } else { - value = Reader.ReadString(); + textValue = Reader.ReadString(); + } + // For string arrays with XmlText, split on whitespace to support XML Schema list types + if (anyTextMapping.TypeDesc.Type == typeof(string[])) + { + string[] vals = textValue.Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries); + value = vals; + } + else + { + value = textValue; } } else diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs index e978fe1e6a8190..c96a1808b43fb8 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs @@ -360,7 +360,12 @@ private void WriteText(object o, TextAccessor text) } else { - if (!WritePrimitiveValue(primitiveMapping.TypeDesc!, o, out stringValue)) + // Handle string arrays as space-separated lists for XML Schema list types + if (o is string[] stringArray) + { + stringValue = string.Join(" ", stringArray); + } + else if (!WritePrimitiveValue(primitiveMapping.TypeDesc!, o, out stringValue)) { Debug.Assert(o is byte[]); } diff --git a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs index 0d94c9fb861b25..6d9d058bf572e6 100644 --- a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs +++ b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs @@ -758,10 +758,11 @@ public static void XML_TypeWithXmlTextAttributeOnArray() var actual = SerializeAndDeserialize(original, @" -val1val2"); +val1 val2"); Assert.NotNull(actual.Text); - Assert.StrictEqual(1, actual.Text.Length); - Assert.Equal("val1val2", actual.Text[0]); + Assert.StrictEqual(2, actual.Text.Length); + Assert.Equal("val1", actual.Text[0]); + Assert.Equal("val2", actual.Text[1]); } [Fact]