десериализация строки, которая имеет больше узлов, чем тип, который будет возвращен в c # - PullRequest
0 голосов
/ 02 июля 2018

У меня есть строка XML, которая извлекается как строка XML из вызова API. Мне нужно преобразовать это в модель представления в моем приложении, чтобы это можно было отобразить в представлении. однако, поскольку у viewmodel есть только несколько узлов / элементов, которые есть в документе xml, я получаю исключение, когда пытаюсь десериализовать его. ниже код и ошибка.

Конечная точка API возвращает это

<response>
  <data>
    <categories>
      <category>
        <id>1</id>
        <name>hats</name>
      </category>
    </categories>
  </data>
</response>

Код:

namespace CatApp.Models
{
[XmlRoot("Categories")]
public class CategoriesViewModel
{
    public CategoriesViewModel()
    {
        _categories = new List<Category>();
    }


    private  List<Category> _categories;
    [XmlElement("Category")]
    public List<Category> Categories
    {
        get { return _categories; }
        set { value = _categories; }
    }

    public class Category
    {
        [XmlElement("Id")]
        public int Id { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }
    }

  }
}


  public static async Task<CategoriesViewModel> GetAllCategories()
  {
        var model = new CategoriesViewModel();
        try
        {
            var response = await client.GetStreamAsync(uri);
            model = DeserializeXMLToObject<CategoriesViewModel>(response);


        }
        catch (Exception ex)
        {
            var exception = ex;
        }
        return model;
    }

   public static T DeserializeXMLToObject<T>(Stream stream)
   {
        T returnObject = default(T);
        try
        {
                XmlSerializer serializer = new XmlSerializer(typeof(T));

                returnObject = (T)serializer.Deserialize(stream);
        }
        catch (Exception ex)
         {

        }
        return returnObject;
    }

Ошибка при System.Xml.Serialization.XmlSerializer.Deserialize (XmlReader xmlReader, String encodingStyle, события XmlDeserializationEvents)
в System.Xml.Serialization.XmlSerializer.Deserialize (Поток потока)
at CatApp.Controllers.HomeController.DeserializeXMLToObject [T] (Stream поток) в C: \ Users \ umerh \ Source \ \ Repos CatAPI \ CatApp \ Контроллеры \ HomeController.cs: линия 50

1 Ответ

0 голосов
/ 02 июля 2018

Во-первых, имена элементов в атрибутах C # должны совпадать с именами элементов в XML. Чувствительно к регистру: Categories не равно categories и т. Д.

[XmlRoot("categories")] // <--
public class CategoriesViewModel
{
    public CategoriesViewModel()
    {
        _categories = new List<Category>();
    }

    private List<Category> _categories;

    [XmlElement("category")] // <--
    public List<Category> Categories
    {
        get { return _categories; }
        set { value = _categories; }
    }

    public class Category
    {
        [XmlElement("id")] // <--
        public int Id { get; set; }

        [XmlElement("name")] // <--
        public string Name { get; set; }
    }
}

Во-вторых, вы можете пропустить некоторые элементы xml следующим образом:

public static T DeserializeXMLToObject<T>(Stream stream)
{
    T returnObject = default(T);
    try
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        using (var xmlReader = XmlReader.Create(stream))
        {
            xmlReader.ReadToFollowing("categories"); // Skip elements before categories node
            returnObject = (T)serializer.Deserialize(xmlReader);
        }
    }
    catch (Exception ex)
    {

    }
    return returnObject;
}
...