You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取并存储XML文件数据的实现方法咨询

嘿,我来给你梳理几种实用的实现方式,结合你提到的那些方法,直接上代码和解释,你看着选最顺手的就行~

先把你的XML内容贴出来方便对照:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <circuit name="local">
    <Device>device1</Device>
    <Point>point1&gt;&lt;/Point>
  </circuit>
  <circuit name="remote">
    <Device>device2</Device>
    <Point>point2</Point>
  </circuit>
</configuration>

首先我们可以先定义一个实体类来存储读取到的电路数据,这样后续操作更方便:

public class Circuit
{
    public string Name { get; set; }
    public string Device { get; set; }
    public string Point { get; set; }
}

方法1:Linq to XML(最简洁直观)

这种方式代码量最少,可读性高,适合小到中等大小的XML文件,直接用Linq查询就能把数据转成实体集合:

using System.Xml.Linq;

// 加载XML文件(也可以加载字符串,这里以文件为例)
XDocument doc = XDocument.Load("你的XML文件路径.xml");

// 查询所有circuit节点,转换成Circuit对象列表
List<Circuit> circuits = doc.Descendants("circuit")
    .Select(c => new Circuit
    {
        Name = c.Attribute("name")?.Value,
        Device = c.Element("Device")?.Value,
        Point = c.Element("Point")?.Value
    })
    .ToList();

// 现在circuits集合里就存储了所有电路数据,后续可以存数据库、本地文件等

优点:代码简洁,逻辑清晰;缺点:会把整个XML加载到内存,超大文件不适用

方法2:XmlReader(内存友好,适合大XML)

如果你的XML文件特别大,用XmlReader流式读取更省内存,它不会一次性加载整个文件,而是逐节点处理:

using System.Xml;

List<Circuit> circuits = new List<Circuit>();
Circuit currentCircuit = null;

using (XmlReader reader = XmlReader.Create("你的XML文件路径.xml"))
{
    while (reader.Read())
    {
        // 找到circuit节点的开始标签
        if (reader.IsStartElement("circuit"))
        {
            currentCircuit = new Circuit();
            // 读取name属性
            currentCircuit.Name = reader.GetAttribute("name");
        }
        // 读取Device子元素
        else if (reader.IsStartElement("Device") && currentCircuit != null)
        {
            currentCircuit.Device = reader.ReadElementContentAsString();
        }
        // 读取Point子元素
        else if (reader.IsStartElement("Point") && currentCircuit != null)
        {
            currentCircuit.Point = reader.ReadElementContentAsString();
            // 读取完Point后,circuit的所有数据都齐了,加入集合
            circuits.Add(currentCircuit);
            currentCircuit = null;
        }
    }
}

// 同样,circuits集合里就是存储好的数据

优点:内存占用极低,适合GB级别的超大XML;缺点:代码相对繁琐,需要手动处理节点逻辑

方法3:XmlSerializer(强类型映射,面向对象场景)

如果希望直接把XML映射到完整的实体类结构,XmlSerializer是不错的选择,它可以直接把整个XML序列化成对象:
首先补充定义Configuration实体类:

using System.Xml.Serialization;

[XmlRoot("configuration")]
public class Configuration
{
    [XmlElement("circuit")]
    public List<Circuit> Circuits { get; set; } = new List<Circuit>();
}

// 之前的Circuit类可以加上Xml相关特性,也可以不加(默认按名称匹配)
public class Circuit
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    public string Device { get; set; }
    public string Point { get; set; }
}

然后读取并序列化:

using System.Xml.Serialization;
using System.IO;

List<Circuit> circuits;

using (FileStream fs = new FileStream("你的XML文件路径.xml", FileMode.Open))
{
    XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
    Configuration config = (Configuration)serializer.Deserialize(fs);
    circuits = config.Circuits;
}

// circuits集合就是存储好的数据

优点:完全面向对象,后续操作实体非常方便;缺点:同样会加载整个XML到内存,且对XML结构的兼容性要求较高

内容的提问来源于stack exchange,提问作者alexsious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:50