C#反序列化含未知数量Device节点的XML文件求助
解决方案
要解决XML反序列化问题,核心是给Parameters和Device类添加正确的XML序列化特性标记,让XmlSerializer能正确识别节点结构。以下是具体实现步骤:
1. 定义正确的实体类
根据XML结构(根节点为<Parameters>,内部包含多个<Device>子节点),给类添加对应特性:
using System.Collections.Generic; using System.Xml.Serialization; // 标记根节点为<Parameters> [XmlRoot("Parameters")] public class Parameters { // 用XmlElement标记,指定每个列表元素对应XML中的<Device>节点 // 这样XmlSerializer会直接将<Parameters>下的所有<Device>节点存入列表,无需中间包裹节点 [XmlElement("Device")] public List<Device> Devices { get; set; } = new List<Device>(); } // Device类,根据XML中<Device>的实际子节点定义属性 public class Device { // 示例:假设<Device>下有<Id>和<Name>节点,根据实际情况修改 [XmlElement("Id")] public int Id { get; set; } [XmlElement("Name")] public string Name { get; set; } // 添加其他对应XML节点的属性... }
2. 验证反序列化方法
你原有的DeserializeObjectXMLFile方法无需修改,只要实体类定义正确,就能正常反序列化:
public static Parameters DeserializeObjectXMLFile(String fileToRead) { try { XmlSerializer xs = new XmlSerializer(typeof(Parameters)); using (StreamReader sr = new StreamReader(fileToRead)) { return xs.Deserialize(sr) as Parameters; } } catch (Exception ex) { Logger.Error(ex); throw; } }
关键注意点
- 所有实体类和属性必须是public访问修饰符,
XmlSerializer无法序列化非公共成员。 Device类的属性要和XML中<Device>的子节点名称完全匹配(大小写敏感),也可通过XmlElement的ElementName参数指定对应关系(比如[XmlElement("DeviceId")]对应XML中的<DeviceId>节点)。- 若XML包含命名空间,需在
XmlRoot和XmlElement中指定Namespace参数。
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

