如何将HTTP POST返回的XML反序列化为List<class>并解决相关报错
错误原因
- 实体类根节点配置与XML实际根节点不匹配:返回XML的根节点是
DataSet,但你配置的[XmlRoot("MTM")]将根节点指定为MTM,序列化器找不到对应节点直接报错 - 未匹配命名空间:返回的
DataSet节点带有命名空间http://tempuri.org/,你的实体类没有配置对应命名空间 - 实体层级结构错误:根据XSD定义,
MTM节点是嵌套在NewDataSet节点下的列表项,你的实体类层级完全不匹配XML结构
解决方法
方案1:修正实体类结构(按XML结构匹配)
// 匹配根节点DataSet,指定对应命名空间 [XmlRoot("DataSet", Namespace = "http://tempuri.org/")] public class ResponseDataSet { [XmlElement("NewDataSet", Namespace = "")] public NewDataSet Data { get; set; } } public class NewDataSet { [XmlElement("MTM", Namespace = "")] public List<MTMItem> MTMList { get; set; } } public class MTMItem { // XSD里minOccurs=0,建议用可空类型避免空值报错 [XmlElement("MTMDate")] public DateTime? MTMDate { get; set; } // 其他字段按XSD定义补充 }
反序列化代码调整:
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); XmlSerializer xmlSerializer = new XmlSerializer(typeof(ResponseDataSet)); ResponseDataSet result = (ResponseDataSet)xmlSerializer.Deserialize(response.GetResponseStream()); List<MTMItem> mtmList = result?.Data?.MTMList;
方案2:直接用.NET内置DataSet读取(更简单,适合返回标准DataSet XML的场景)
不需要手动适配全量实体结构,直接读取后转列表:
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); DataSet ds = new DataSet(); ds.ReadXml(response.GetResponseStream()); // 读取MTM表转自定义列表 List<MTMItem> list = ds.Tables["MTM"].AsEnumerable().Select(row => new MTMItem { MTMDate = row.Field<DateTime?>("MTMDate"), // 其他字段赋值 }).ToList();
补充疑问解答
你贴的data变量是POST请求的请求体数据,是你发送给服务端的内容,不是服务端返回的XML数据,你要反序列化的内容仅来自response.GetResponseStream(),和这个data无关。
内容的提问来源于stack exchange,提问作者vicNeo
相关产品推荐
相关产品推荐

