C#读取并存储XML文件数据的实现方法咨询
嘿,我来给你梳理几种实用的实现方式,结合你提到的那些方法,直接上代码和解释,你看着选最顺手的就行~
先把你的XML内容贴出来方便对照:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <circuit name="local"> <Device>device1</Device> <Point>point1></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
相关产品推荐
相关产品推荐

