我有一个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中的元素名称匹配。区分大小写: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;
}