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