【问题标题】:Deserialize xml to object from webapi从 webapi 将 xml 反序列化为对象
【发布时间】:2014-04-26 06:20:59
【问题描述】:

由于我不会进入这里的原因,我不能将对象类型用作我的 webapi 控制器的参数。因此,我需要想办法使用 XmlDocument 或类似的方法将 xml 对象反序列化为我的 c# 对象。

这是我目前所拥有的:

    public void Post(HttpRequestMessage request)
    {
        var xmlDoc = new XmlDocument();
        xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
        using (XmlReader xmlReader = new XmlNodeReader(xmlDoc))
        {
            Object obj = new XmlSerializer(typeof(myObject)).Deserialize(xmlReader);
            myObject scp = (myObject)obj;
        } 
    }

不幸的是,这会引发错误。谁能提供一些关于如何将我的 xml 反序列化为我的对象的建议?

tia

编辑:这是我要反序列化的 xml:

<Student>
<studentid>1234</studentid>
<command>post</command>
<posttype>charge</posttype>
<transaction_description>This is a test post to the web api</transaction_description>
<payment_type>CC</payment_type>
<term_code>2013SPRING</term_code>
<amount>432.75</amount>
</Student>

这是我得到的错误:

System.InvalidOperationException:不是预期的。 生成时间:格林威治标准时间 2014 年 3 月 19 日星期三 20:18:58

System.InvalidOperationException:XML 文档中存在错误 (1, 2)。 ---> System.InvalidOperationException: 是 没想到。在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderStudentChargePost.Read3_StudentChargePost() --- 内部异常堆栈跟踪结束 --- 在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader、字符串 encodingStyle、XmlDeserializationEvents 事件)
在 System.Xml.Serialization.XmlSerializer.Deserialize(Stream 流)
在 CashNetSSO.Controllers.API.StudentInformationPostController.Post(HttpRequestMessage 请求)在 C:\Projects\CashNetSSO\Development\CashNetSSO\CashNetSSO\Controllers\API\StudentInformationPostController.cs:line 23 at lambda_method(Closure, Object, Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_DisplayClassf.b_9(Object 实例,对象 [] 方法参数)在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 实例,对象 [] 参数)在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.c_DisplayClass5.b_4() 在 System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult](Func`1 func, CancellationToken cancelToken)

【问题讨论】:

    标签: c# deserialization xmldocument xmlreader


    【解决方案1】:

    如果您已经以流的形式阅读内容,您可以执行以下操作:

        myObject scp = null;
        XmlSerializer serializer = new XmlSerializer(typeof(myObject);
        using (Stream stream = request.Content.ReadAsStreamAsync().Result)
        {
            scp = serializer.Deserialize(stream);
        }
    

    编辑:

    您收到错误的原因是 XmlSerializer 需要一个 xml 声明标记。如果您的 xml 不包含此内容,您可以定义 root 属性,如下所示:

        XmlSerializer serializer = new XmlSerializer(typeof(myObject), new XmlRootAttribute("Student"));
    

    【讨论】:

    • 我仍然收到错误消息。我已经用我发送的 xml 和我收到的错误更新了我的 OP。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多