Давайте создадим такой класс модели:
[XmlRoot("details")]
public class Details
{
[XmlElement("name")]
public string Name { get; set; }
public int? Id { get; set; }
}
Затем при создании сериализатора мы подпишем его на событие UnknownElement
. В обработчике событий мы вручную проверяем содержимое элемента id
и устанавливаем желаемые значения.
static void Main()
{
string input = @"<?xml version='1.0' encoding='UTF-8'?>
<details>
<name>ABC</name>
<id />
</details>";
var serializer = new XmlSerializer(typeof(Details));
serializer.UnknownElement += Serializer_UnknownElement;
Details details = null;
using (var stringReader = new StringReader(input))
{
details = (Details)serializer.Deserialize(stringReader);
}
Console.WriteLine(details.Name);
Console.WriteLine(details.Id);
}
private static void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
if (e.Element.Name == "id")
{
var details = (Details)e.ObjectBeingDeserialized;
if (string.IsNullOrWhiteSpace(e.Element.InnerText))
details.Id = null;
else
details.Id = int.Parse(e.Element.InnerText);
}
}