如何使用RestSharp反序列化API返回的XML至对象?
解决XML反序列化为对象的问题
我看了你的XML内容和实体类代码,问题出在Sube类的特性标记上——你给Sube类加了[XmlRoot(ElementName = "Sube")],但XmlRoot特性是用来指定整个XML文档的根元素的,而Sube是嵌套在Sistemrent下的子元素,这个标记会干扰XmlSerializer的解析逻辑,导致反序列化失败。
修正后的实体类
把Sube类上的[XmlRoot]去掉,换成[XmlType](或者直接删除该特性也可以,因为默认会用类名匹配元素名),修正后的代码如下:
[XmlRoot(ElementName = "Sistemrent")] public class Sistemrent { [XmlElement(ElementName = "Sube")] public List<Sube> Sube { get; set; } } // 替换XmlRoot为XmlType,或者直接删除该特性 [XmlType(ElementName = "Sube")] public class Sube { [XmlElement(ElementName = "Sube_Kodu")] public string Sube_Kodu { get; set; } [XmlElement(ElementName = "Sube_Ismi")] public string Sube_Ismi { get; set; } [XmlElement(ElementName = "Kayit_ID")] public string Kayit_ID { get; set; } [XmlAttribute(AttributeName = "id")] public string Id { get; set; } }
完整的反序列化代码示例
接下来用XmlSerializer来完成反序列化,这里提供一个可直接运行的实现:
using System; using System.IO; using System.Xml.Serialization; public class XmlDeserializerHelper { public static Sistemrent DeserializeXml(string xmlContent) { var serializer = new XmlSerializer(typeof(Sistemrent)); using (var reader = new StringReader(xmlContent)) { return (Sistemrent)serializer.Deserialize(reader); } } // 测试验证用例 public static void Main() { string xmlContent = @"<Sistemrent> <Sube id=""1""> <Sube_Kodu>ABC</Sube_Kodu> <Sube_Ismi>AAA BBB</Sube_Ismi> <Kayit_ID>1</Kayit_ID> </Sube> <Sube id=""2""> <Sube_Kodu>BCD</Sube_Kodu> <Sube_Ismi>BBB CCC</Sube_Ismi> <Kayit_ID>1</Kayit_ID> </Sube> </Sistemrent>"; var result = DeserializeXml(xmlContent); foreach (var sube in result.Sube) { Console.WriteLine($"ID: {sube.Id}, 代码: {sube.Sube_Kodu}, 名称: {sube.Sube_Ismi}"); } } }
验证结果
运行上面的测试代码,会输出:
ID: 1, 代码: ABC, 名称: AAA BBB ID: 2, 代码: BCD, 名称: BBB CCC
说明反序列化已经成功完成。
额外注意事项
- 确保所有属性的名称和XML中的元素/属性名称完全匹配(XML解析是大小写敏感的)
- 如果你的XML带有命名空间,需要在
XmlRoot和XmlElement特性中指定Namespace属性 - 生产环境中建议添加异常处理,捕获
InvalidOperationException等可能的反序列化异常
内容的提问来源于stack exchange,提问作者Hidayet Güngörür
相关产品推荐
相关产品推荐

