在客户端上反序列化mvc web api c# xml

本文关键字:api xml web mvc 客户端 反序列化 | 更新日期: 2023-09-27 17:50:58

我有一个MVC web api返回列表返回给客户机的XML如下所示:

<ArrayOfLeadChange xmlns="The-namespace">
<LeadChange>
...
<LeadChange>
<ArrayOfLeadChange>

我已经将类LeadChange复制到客户端,并尝试将xml反序列化到列表,但我得到一个异常,即xml"意外"中有错误

是否有一种很好的方法来获取或反序列化,以便我可以在客户端使用对象?

在客户端上反序列化mvc web api c# xml

添加对System.Net.Http.Formatting的引用-这是Web API的一部分,但如果您没有在客户端安装Web API程序集,您可以从Nuget获取客户端位- http://nuget.org/packages/Microsoft.AspNet.WebApi.Client/4.0.20710.0

PM> Install-Package Microsoft.AspNet.WebApi.Client -Version 4.0.20710.0

然后可以从Web API获取并使用ReadAsAsync<T> - http://msdn.microsoft.com/en-us/library/hh944541(v=vs.108).aspx进行反序列化

例如:

var myobjects = Request.Content.ReadAsAsync<List<LeadChange>>().Result;

我不确定手动反序列化是否是您用例的正确路径。但是,如果您想要一个好的、全面的XML反序列化器,可以试试这个。

编辑:这是返回一个集合的正确函数。

    /// <summary>
    /// Converts an XDoc into a List<T> of entities
    /// </summary>
    /// <typeparam name="T">Any serializable object</typeparam>
    /// <param name="doc"></param>
    /// <returns></returns>
    public static List<T> DeserializeCollection<T>(XDocument doc)
    {
        if (doc == null)
            return null;
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
            XmlReader reader = doc.CreateReader();
            List<T> result = (List<T>)serializer.Deserialize(reader);
            reader.Close();
            return result;
        }
        catch (Exception e)
        {
            Logging.Log(Severity.Error, "Unable to deserialize document.", e);
            return null;
        }
    }

我不知道为什么你在<ArrayOf节点有一个命名空间。试着把它去掉。这应该行得通。您还可以将List输入该函数,以查看"正确的"/"期望的"XML应该是什么。

    /// <summary>
    /// Converts a List<T> of entities into an XDoc.
    /// </summary>
    /// <typeparam name="T">Any serializable object</typeparam>
    /// <param name="doc"></param>
    /// <param name="paramList"></param>
    public static XDocument SerializeCollection<T>(List<T> paramList)
    {
        if (paramList == null)
            return null;
        XDocument doc = new XDocument();
        try
        {
            XmlSerializer serializer = new XmlSerializer(paramList.GetType());
            XmlWriter writer = doc.CreateWriter();
            serializer.Serialize(writer, paramList);
            writer.Close();
            return doc;
        }
        catch (Exception e)
        {
            Logging.Log(Severity.Error, "Unable to serialize list", e);
            return null;
        }
    }
}