从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)
如果您已经将内容作为流读取,则可以执行以下操作:
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"));