C# XML反序列化遇InvalidOperationException异常求助
问题原因分析
- XML中的
<bns:result>节点属于http://api.platform.boomi.com/命名空间,但Plan类未配置对应命名空间规则,导致XmlSerializer无法匹配类型 Plan类的planName属性与XML中的name属性名称不匹配,无法自动映射赋值- 默认情况下
XmlSerializer期望根节点名称为Plan,但实际待反序列化的节点是result
解决方案
1. 修改Plan类的XML序列化特性
通过特性指定节点名称、命名空间以及属性映射关系:
using System.Xml.Serialization; [XmlRoot(ElementName = "result", Namespace = "http://api.platform.boomi.com/")] public class Plan { [XmlAttribute("planId")] public int planId { get; set; } [XmlAttribute("name")] public string planName { get; set; } }
2. 修正后的完整反序列化代码
原代码结构无需大幅调整,添加特性后即可正常反序列化:
XmlDocument doc = new XmlDocument(); doc.LoadXml(response.Result); List<Plan> plans = new List<Plan>(); if (doc != null) { var nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("bns", "http://api.platform.boomi.com/"); var nodes = doc.SelectNodes(@"//bns:result", nsmgr); XmlSerializer xmlSerializer = new XmlSerializer(typeof(Plan)); foreach(XmlNode node in nodes) { using (XmlNodeReader xmlReader = new XmlNodeReader(node)) { Plan plan = (Plan)xmlSerializer.Deserialize(xmlReader); plans.Add(plan); } } }
关键说明
[XmlRoot]特性指定了XML节点名称为result,并匹配了bns对应的命名空间,解决了节点不匹配的异常[XmlAttribute("name")]将类中的planName属性与XML的name属性绑定,确保属性值能正确映射读取
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

