反序列化具有更多节点的字符串然后键入将在c#中返回的字符串

问题描述 投票:0回答:1

我有一个XML字符串,它从API调用中检索为xml字符串。我需要在我的应用程序中将其转换为视图模型,以便可以在视图中显示。但是由于viewmodel只有很少的节点/元素,因为在我尝试反序列化它时,我会得到一个异常抛出的xml文档。下面是代码和错误。

API End Point返回此信息

<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(Stream stream) 位于C:\ Users \ umerh \ source \ repos \ CatAPI \ CatApp \ Controllers \ HomeController.cs中的CatApp.Controllers.HomeController.DeserializeXMLToObject [T](Stream stream):第50行

c# xml deserialization xml-serialization
1个回答
1
投票

首先,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;
}
© www.soinside.com 2019 - 2024. All rights reserved.