You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:09:04