如何反序列化XML提取标签数据并映射至自定义C#类?
解决XML反序列化到PassengerDetails类的问题
你可以通过调整类的序列化特性,配合.NET自带的XmlSerializer完成XML字符串到自定义类的反序列化,具体步骤如下:
1. 调整PassengerDetails类,匹配XML节点
由于XML根节点是<Passenger>(与类名PassengerDetails不符),且<cardNumber>标签和类属性CardNumber大小写不一致,需要添加序列化特性显式映射:
using System.Xml.Serialization; [XmlRoot("Passenger")] // 指定XML根节点名称 public class PassengerDetails { public PassengerDetails() { } // 必须保留无参构造函数,序列化要求 public string Name { get; set; } public string Email { get; set; } [XmlElement("cardNumber")] // 映射XML中的小写cardNumber标签 public string CardNumber { get; set; } }
2. 编写反序列化代码
利用XmlSerializer将XML字符串转换为PassengerDetails实例,注意XML编码为utf-16,C#字符串默认采用UTF-16编码,直接用StringReader即可处理:
using System.IO; using System.Xml.Serialization; // 假设XML字符串已存储在RequestPassengerXML变量中 string RequestPassengerXML = @"<?xml version=""1.0"" encoding=""utf-16""?> <Passenger xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> <Name>John Vaz</Name> <Email>john@gmail.com</Email> <cardNumber>CB2390VT</cardNumber> </Passenger>"; // 创建序列化器实例 XmlSerializer serializer = new XmlSerializer(typeof(PassengerDetails)); // 读取XML字符串并反序列化 using (StringReader reader = new StringReader(RequestPassengerXML)) { PassengerDetails passenger = (PassengerDetails)serializer.Deserialize(reader); // 此时可直接访问类成员 // 示例:输出提取到的信息 Console.WriteLine($"姓名:{passenger.Name}"); Console.WriteLine($"邮箱:{passenger.Email}"); Console.WriteLine($"卡号:{passenger.CardNumber}"); }
核心注意点
- 类必须保留公共无参构造函数,
XmlSerializer依赖它创建实例。 - 当XML节点与类属性名称(含大小写)不匹配时,必须用
XmlRoot、XmlElement等特性做映射,否则对应属性会被赋值为null。 - XML中的命名空间不影响属性匹配,无需额外处理即可正常提取数据。
内容的提问来源于stack exchange,提问作者user2240189
相关产品推荐
相关产品推荐

