XML反序列化报错:<xmlns=''> was not expected 求助排查
反序列化XML时
<xmlns=''> was not expected错误的解决办法 你的问题主要出在反序列化代码的类型错误和实体类的XML注解错误两个方面,具体修正如下:
1. 反序列化代码的致命错误
你创建XmlSerializer时传入了typeof(string),但实际要反序列化成ReferenceResponse类型,这会导致序列化器期望的XML结构和服务器返回的完全不匹配,直接触发错误。
修正后的反序列化代码:
XmlSerializer serializer = new XmlSerializer(typeof(ReferenceResponse)); using (TextReader reader = new StringReader(response.Data)) { var result = (ReferenceResponse)serializer.Deserialize(reader); }
2. 实体类的XML注解错误
原XML中,ServerVersion、XmlVersion等都是<RK7QueryResult>节点的属性(而非子元素),Reference类中的RefName、Count等也是<RK7Reference>的属性,你错误地使用了[XmlElement]注解,应该替换为[XmlAttribute];同时RK7RefList的子元素需要用[XmlArrayItem]指定名称。
修正后的实体类
[XmlRoot("RK7QueryResult")] public class ReferenceResponse { [XmlAttribute("ServerVersion")] public string ServerVersion { get; set; } [XmlAttribute("XmlVersion")] public int XmlVersion { get; set; } [XmlAttribute("NetName")] public string NetName { get; set; } [XmlAttribute("CMD")] public string CMD { get; set; } [XmlAttribute("Status")] public string Status { get; set; } [XmlAttribute("ErrorText")] public string ErrorText { get; set; } [XmlAttribute("DateTime")] public DateTime DateTime { get; set; } [XmlAttribute("WorkTime")] public int WorkTime { get; set; } [XmlAttribute("Processed")] public int Processed { get; set; } [XmlAttribute("ArrivalDateTime")] public DateTime ArrivalDateTime { get; set; } // 处理RK7RefList下的子节点 [XmlArray("RK7RefList")] [XmlArrayItem("RK7Reference")] public List<Reference> RK7RefList { get; set; } } // 不需要XmlRoot注解,因为它不是XML根节点 public class Reference { [XmlAttribute("RefName")] public string RefName { get; set; } [XmlAttribute("Count")] public int Count { get; set; } [XmlAttribute("DataVersion")] public int DataVersion { get; set; } }
可选:获取RK7RefList的Count属性
如果需要读取<RK7RefList Count="154">中的Count值,需要给RK7RefList单独定义容器类,调整ReferenceResponse的对应字段:
[XmlRoot("RK7QueryResult")] public class ReferenceResponse { // 保留其他属性... // 替换原RK7RefList定义为以下内容 [XmlElement("RK7RefList")] public RK7RefListContainer RK7RefList { get; set; } } [XmlType("RK7RefList")] public class RK7RefListContainer { [XmlAttribute("Count")] public int Count { get; set; } [XmlElement("RK7Reference")] public List<Reference> References { get; set; } } public class Reference { // 保留原属性... }
内容的提问来源于stack exchange,提问作者Minh Kim
相关产品推荐
相关产品推荐

