Как справиться с проблемой самозакрывающихся тегов при XML десериализации в C# - PullRequest
0 голосов
/ 16 июня 2020

Невозможно десериализовать, если строка XML содержит самозакрытые теги. Ошибка: в документе XML (4, 1) есть ошибка. Я могу избежать, если я изменю тип данных на строку. но мне нужно поддерживать тип данных int. без использования nullable int.

public class model
{
       [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class details
    {

                private string name;
                private int id;
    }
}

public void process()
{
   string text = "<?xml version="1.0" encoding="UTF-8"?>
                 <details>
                 <name>ABC</name>
                 <id /> 
                 </details>"


    Deserialize<model>(text);

}

    public T Deserialize<T>(string input) where T : class
   {
     try
      {

                System.Xml.Serialization.XmlSerializer ser = new 
                System.Xml.Serialization.XmlSerializer(typeof(T));

                using StringReader sr = new StringReader(input);
                return (T)ser.Deserialize(sr);
            }
            catch (Exception ex)
            {
                _logger?.LogError(ex, "error");
                return null;
            }
            finally { }
        }
  }

1 Ответ

0 голосов
/ 16 июня 2020

Давайте создадим такой класс модели:

[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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...