从webapi反序列化xml到对象

本文关键字:对象 xml 反序列化 webapi | 更新日期: 2023-09-27 17:50:56

由于我不在这里详述的原因,我不能在我的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>

,这里是我得到的错误:

系统。InvalidOperationException:不期望。生成日期:星期三,2014年3月19日20:18:58 GMT

系统。InvalidOperationException: XML文档中有错误(1,2). -->系统。InvalidOperationException:出乎意料的时候。在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderStudentChargePost.Read3_StudentChargePost ()——内部异常堆栈跟踪结束——在system . xml . serialize . xmlserializer . deserialize (XmlReader . xmlxmlReader, String encodingStyle, XmlDeserializationEvents事件)
在System.Xml.Serialization.XmlSerializer。反序列化(流流)
在CashNetSSO.Controllers.API.StudentInformationPostController.Post (HttpRequestMessage请求)C: ' '项目CashNetSSO '开发' CashNetSSO ' CashNetSSO '控制器' API ' StudentInformationPostController.cs:行lambda_method(Closure, Object, Object[]System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor灵活;> c_ DisplayClassf.b _9(对象实例,对象[]方法参数)System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象实例,对象[]参数)System.Web.Http.Controllers.ReflectedHttpActionDescriptor灵活;> c_ DisplayClass5.b _4 ()在System.Threading.Tasks.TaskHelpers.RunSynchronously TResult (Func的1function, CancellationToken CancellationToken)

从webapi反序列化xml到对象

如果您已经将内容作为流读取,则可以执行以下操作:

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

您得到错误的原因是因为XmlSerializer期望xml声明标记。如果您的xml不包含这个,您可以像下面这样定义根属性:

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