如何使用C#读取XML并将数据填充到List<T>中
用C#读取XML并填充到List的实现方案
我来给你详细说说怎么实现这个需求,步骤其实很清晰,主要分为定义数据实体类和解析XML并映射数据两部分,下面给你两种常用的实现方式:
第一步:定义对应XML结构的实体类
首先你需要创建一个和ordini表字段对应的实体类,属性名可以和XML里的field的name属性对应(也可以自定义,只要映射时对应上就行):
public class Ordini { public string Id { get; set; } public string Anno { get; set; } public string Att { get; set; } public string Cen { get; set; } // 根据XML里的其他field,继续添加对应的属性即可 }
第二步:解析XML并填充List
方式一:使用LINQ to XML(推荐,代码更简洁现代)
LINQ to XML是.NET里比较新的XML处理API,语法更简洁,适合快速实现:
using System.Xml.Linq; using System.Collections.Generic; using System.Linq; // 加载XML文件(如果是XML字符串,用XDocument.Parse(xmlString)代替) XDocument xmlDoc = XDocument.Load("你的XML文件路径.xml"); // 查询并映射数据到List<Ordini> List<Ordini> ordiniList = xmlDoc.Descendants("table") // 筛选出name为"ordini"的table节点 .Where(table => table.Attribute("name")?.Value == "ordini") // 获取该table下的所有row节点 .Elements("row") // 将每个row节点映射为Ordini对象 .Select(row => new Ordini { // 根据field的name属性匹配取值,处理空值避免报错 Id = row.Elements("field").FirstOrDefault(f => f.Attribute("name")?.Value == "id")?.Value ?? string.Empty, Anno = row.Elements("field").FirstOrDefault(f => f.Attribute("name")?.Value == "anno")?.Value ?? string.Empty, Att = row.Elements("field").FirstOrDefault(f => f.Attribute("name")?.Value == "att")?.Value ?? string.Empty, Cen = row.Elements("field").FirstOrDefault(f => f.Attribute("name")?.Value == "cen")?.Value ?? string.Empty, // 其他字段按同样方式添加即可 }) .ToList();
方式二:使用XmlDocument(传统API,适合习惯旧写法的场景)
如果你更习惯使用传统的XmlDocument API,也可以这样实现:
using System.Xml; using System.Collections.Generic; List<Ordini> ordiniList = new List<Ordini>(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("你的XML文件路径.xml"); // 定位到name为"ordini"的table节点 XmlNode tableNode = xmlDoc.SelectSingleNode("//table[@name='ordini']"); if (tableNode != null) { // 遍历所有row节点 foreach (XmlNode rowNode in tableNode.SelectNodes("row")) { Ordini ordini = new Ordini(); // 遍历当前row下的所有field节点 foreach (XmlNode fieldNode in rowNode.SelectNodes("field")) { string fieldName = fieldNode.Attributes["name"]?.Value; string fieldValue = fieldNode.InnerText; // 根据field的name属性给实体类赋值 switch (fieldName) { case "id": ordini.Id = fieldValue; break; case "anno": ordini.Anno = fieldValue; break; case "att": ordini.Att = fieldValue; break; case "cen": ordini.Cen = fieldValue; break; // 其他字段继续添加对应的case分支 } } ordiniList.Add(ordini); } }
一些注意事项
- 如果XML里的字段可能不存在,一定要处理空值(比如用
FirstOrDefault代替First,再结合??赋值默认值),避免出现NullReferenceException。 - 如果字段是数值类型(比如
anno是年份,应该是int),可以用int.TryParse来安全转换,比如:if (int.TryParse(row.Elements("field").FirstOrDefault(f => f.Attribute("name")?.Value == "anno")?.Value, out int anno)) { ordini.Anno = anno; } - 记得替换代码里的
你的XML文件路径.xml为实际的文件路径,如果是从内存读取XML字符串,就用对应的Parse方法代替Load。
内容的提问来源于stack exchange,提问作者jon




