从web api反序列化xml到对象

时间:2014-03-19 18:49:44

标签: c# deserialization xmldocument xmlreader

由于我不会进入这里的原因,我无法将对象类型用作我的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 GMT

     

System.InvalidOperationException:XML文档中存在错误   (1,2)。 ---&GT; System.InvalidOperationException:是的   没想到。在   Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderStudentChargePost.Read3_StudentChargePost()   ---内部异常堆栈跟踪结束---在System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader)   xmlReader,String encodingStyle,XmlDeserializationEvents事件)
  在System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
  在   CashNetSSO.Controllers.API.StudentInformationPostController.Post(HttpRequestMessage   请求)   C:\项目\ CashNetSSO \开发\ CashNetSSO \ CashNetSSO \控制器\ API \ StudentInformationPostController.cs:行   23在lambda_method(Closure,Object,Object [])at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor&LT;&GT; C_ DisplayClassf.b _9(对象   instance,Object [] methodParameters)at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象   instance,Object [] arguments)at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor&LT;&GT; C_ DisplayClass5.b _4()   在System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult](Func`1   func,CancellationToken cancellationToken)

1 个答案:

答案 0 :(得分:4)

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

    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"));