C#解析XML到List<myClass>时Name属性为空问题求助
问题解决:XML解析后Name属性为null的问题
问题背景
给定XML内容:
<NewDataSet xmlns="http://anonymous_link_here"> <Table> <Name>Example</Name> </Table> <Table> <Name>Example</Name> </Table> <Table> <Name>Example</Name> </Table> <Table> <Name>Example</Name> </Table> </NewDataSet>
解析代码:
public static List<myClass> ConvertToList(string xml) { var objects= XDocument.Parse(xml); var objectsList= (from o in objects.Root.Elements() select new myClass() { Name = (string)o.Element("Name"), }).ToList(); return objectsList; }
myClass定义:
[Serializable] [XmlRoot("Table"), Namespace="http://anonymous_link_here"] public class myClass{ [XmlElement(ElementName="Name"), Namespace="http://anonymous_link_here"] public string Name { get; set; } }
当前解析结果:objectsList元素数量正确,但所有元素的Name属性均为null。
问题原因
XML根节点NewDataSet声明了命名空间http://anonymous_link_here,默认所有子元素(包括Table和Name)都继承该命名空间。但代码中o.Element("Name")未指定命名空间,无法匹配到对应元素,因此返回null。
解决方案
方案1:指定命名空间定位元素
修改解析代码,先定义命名空间,再通过命名空间获取目标元素:
public static List<myClass> ConvertToList(string xml) { XNamespace ns = "http://anonymous_link_here"; var objects= XDocument.Parse(xml); var objectsList= (from o in objects.Root.Elements(ns + "Table") select new myClass() { Name = (string)o.Element(ns + "Name"), }).ToList(); return objectsList; }
通过ns + "元素名"的方式明确指定元素所属命名空间,即可正确定位到Name元素。
方案2:使用XmlSerializer反序列化(更简洁)
利用已定义的myClass特性,直接通过XmlSerializer自动完成映射:
public static List<myClass> ConvertToList(string xml) { var serializer = new XmlSerializer(typeof(List<myClass>), new XmlRootAttribute("NewDataSet") { Namespace = "http://anonymous_link_here" }); using (var reader = new StringReader(xml)) { return (List<myClass>)serializer.Deserialize(reader); } }
该方式无需手动遍历节点,直接依赖类上配置的命名空间特性完成解析,代码更简洁且不易出错。
内容的提问来源于stack exchange,提问作者ELOL
相关产品推荐
相关产品推荐

