You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用C#读取XML并将数据填充到List<T>中

用C#读取XML并填充到List的实现方案

我来给你详细说说怎么实现这个需求,步骤其实很清晰,主要分为定义数据实体类解析XML并映射数据两部分,下面给你两种常用的实现方式:

第一步:定义对应XML结构的实体类

首先你需要创建一个和ordini表字段对应的实体类,属性名可以和XML里的fieldname属性对应(也可以自定义,只要映射时对应上就行):

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

火山引擎 最新活动