Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1011,13 +1011,13 @@ public override string ReadElementContentAsString()

try
{
if (xmlType != null)
if (xmlType != null && typedValue != null)
{
return xmlType.ValueConverter.ToString(typedValue);
}
else
{
return typedValue as string;
return typedValue as string ?? string.Empty;
}
}
catch (InvalidCastException e)
Expand Down
71 changes: 71 additions & 0 deletions src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1763,6 +1763,77 @@ public static void Xml_TypeWithMismatchBetweenAttributeAndPropertyType()
Assert.StrictEqual(value.IntValue, actual.IntValue);
}

[Fact]
public static void Xml_XsdValidationAndDeserialization()
{
var xsdstring = @"<?xml version='1.0' encoding='utf-8'?>
<xs:schema attributeFormDefault='unqualified' elementFormDefault='unqualified' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name='RootClass'>
<xs:complexType>
<xs:sequence>
<xs:element name='Parameters' type='parameters' minOccurs='1' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name='parameters'>
<xs:sequence>
<xs:element name='Parameter' type='parameter' minOccurs='1' maxOccurs='unbounded' />
</xs:sequence>
</xs:complexType>
<xs:complexType name='parameter'>
<xs:attribute type='xs:string' name='Name' use='required' />
</xs:complexType>
<xs:complexType name='stringParameter' >
<xs:complexContent>
<xs:extension base='parameter'>
<xs:sequence>
<xs:element name='Value' minOccurs='0' maxOccurs='1'/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
";
var param = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<RootClass xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
"<Parameters>" +
"<Parameter xsi:type=\"stringParameter\" Name=\"SomeName\">" +
"<Value />" +
"</Parameter>" +
"</Parameters>" +
"</RootClass>";

using (var stream = new MemoryStream())
{
using (var writer = new StreamWriter(stream))
{
writer.Write(param);
writer.Flush();
stream.Position = 0;

var xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.ValidationType = ValidationType.Schema;
xmlReaderSettings.ValidationEventHandler += (sender, args) =>
{
throw new XmlSchemaValidationException(args.Message);
};
xmlReaderSettings.Schemas.Add(null, XmlReader.Create(new StringReader(xsdstring)));

var xmlReader = XmlReader.Create(stream, xmlReaderSettings);

var overrides = new XmlAttributeOverrides();
var parametersXmlAttribute = new XmlAttributes { XmlType = new XmlTypeAttribute("stringParameter") };
overrides.Add(typeof(Parameter<string>), parametersXmlAttribute);

var serializer = new XmlSerializer(typeof(RootClass), overrides);
var result=(RootClass)serializer.Deserialize(xmlReader);

Assert.Equal("SomeName", result.Parameters[0].Name);
Assert.Equal(string.Empty, ((Parameter<string>)result.Parameters[0]).Value);
}
}
}

private static readonly string s_defaultNs = "http://tempuri.org/";
private static T RoundTripWithXmlMembersMapping<T>(object requestBodyValue, string memberName, string baseline, bool skipStringCompare = false, string wrapperName = null)
{
Expand Down
18 changes: 18 additions & 0 deletions src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1264,3 +1264,21 @@ public partial class MsgDocumentType
[System.Xml.Serialization.XmlAttribute("refs", DataType = "IDREFS")]
public string[] Refs { get; set; }
}

public class RootClass
{
[XmlArray]
public List<Parameter> Parameters { get; set; }
}

[XmlInclude(typeof(Parameter<string>))]
public class Parameter
{
[XmlAttribute]
public string Name { get; set; }
}

public class Parameter<T> : Parameter
{
public T Value { get; set; }
}