如何自定义元素名将XML反序列化为List<T>?
解决XML元素名与目标类型不匹配的反序列化问题
我懂你现在的烦恼——想把<root>包含多个<child>的XML反序列化成List<Status>,但元素名和目标类型完全对不上,又不想为了适配XML专门新建类。其实用.NET自带的XmlSerializer就能轻松搞定,核心是靠**特性(Attribute)**做名称映射就行。
具体实现步骤
- 给你的
Status类加上[XmlElement("child")]特性,告诉序列化器这个类型对应XML里的<child>元素; - 创建一个包含
List<Status>的根类,用[XmlRoot("root")]指定根元素名称; - 最后用
XmlSerializer正常执行反序列化操作。
完整示例代码
using System; using System.Collections.Generic; using System.Xml.Serialization; using System.IO; // 目标类型,通过特性映射到XML的<child>元素 public class Status { [XmlAttribute("id")] public int Id { get; set; } [XmlText] public string Text { get; set; } } // 根类,对应XML的<root>元素,包含List<Status> [XmlRoot("root")] public class StatusRoot { [XmlElement("child")] // 指定每个列表项对应<child>元素 public List<Status> Statuses { get; set; } } public class Program { public static void Main() { string xml = @"<root> <child id=""1"">Lorum</child> <child id=""2"">Ipsum</child> <child id=""3"">Dolor</child> </root>"; var serializer = new XmlSerializer(typeof(StatusRoot)); using (var reader = new StringReader(xml)) { var result = (StatusRoot)serializer.Deserialize(reader); foreach (var status in result.Statuses) { Console.WriteLine($"Id: {status.Id}, Text: {status.Text}"); } } } }
代码细节说明
[XmlAttribute("id")]:把Status类的Id属性映射到XML元素的id属性;[XmlText]:把Status类的Text属性映射到<child>元素的文本内容;[XmlRoot("root")]和[XmlElement("child")]:分别指定根元素和列表项对应的XML元素名称,完美解决名称不匹配的问题。
这样你就不用额外创建和XML元素同名的类,直接用List<Status>来接收数据啦。
内容的提问来源于stack exchange,提问作者Jonas B
相关产品推荐
相关产品推荐

