XML写入功能正常,XML读取实现遇阻,寻求技术支持
解决XML读取功能实现问题
嘿,我看你已经把XML写入功能跑通了,现在卡在读取这块对吧?刚好你给出了写入的代码,我先帮你补全完整的写入逻辑(你之前的代码没写完),然后给你匹配两种读取实现方案,完美对接你的写入结构。
首先是补全后的完整XML写入代码:
public void WriteXML() { using (XmlWriter xmlWriter = XmlWriter.Create("logCurves.xml")) { xmlWriter.WriteStartDocument(); xmlWriter.WriteStartElement("log"); foreach (LogCurve logCurve in Curves) { xmlWriter.WriteStartElement("logCurveInfo"); xmlWriter.WriteAttributeString("id", logCurve.Name); xmlWriter.WriteElementString("minValue", logCurve.MinValue.ToString()); xmlWriter.WriteElementString("maxValue", logCurve.MaxValue.ToString()); xmlWriter.WriteEndElement(); // 闭合logCurveInfo元素 } xmlWriter.WriteEndElement(); // 闭合log根元素 xmlWriter.WriteEndDocument(); } }
接下来给你两种读取实现方式:
方式一:使用XmlReader(和你写入用的API风格一致)
这种方式和你用XmlWriter的思路对应,逐节点读取,适合处理大文件:
using System.Xml; using System.Collections.Generic; public List<LogCurve> ReadXML() { List<LogCurve> curves = new List<LogCurve>(); using (XmlReader xmlReader = XmlReader.Create("logCurves.xml")) { // 定位到第一个logCurveInfo元素 while (xmlReader.Read() && xmlReader.Name != "logCurveInfo") { // 跳过无关节点 } do { if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "logCurveInfo") { LogCurve curve = new LogCurve(); // 读取id属性值 curve.Name = xmlReader.GetAttribute("id"); // 读取子元素内容 xmlReader.ReadStartElement("logCurveInfo"); curve.MinValue = double.Parse(xmlReader.ReadElementContentAsString("minValue", "")); curve.MaxValue = double.Parse(xmlReader.ReadElementContentAsString("maxValue", "")); xmlReader.ReadEndElement(); curves.Add(curve); } } while (xmlReader.ReadToNextSibling("logCurveInfo")); } return curves; }
方式二:使用LINQ to XML(更简洁易读)
如果你的XML文件不大,这种写法更清爽,代码量少且可读性高:
using System.Xml.Linq; using System.Collections.Generic; using System.Linq; public List<LogCurve> ReadXMLWithLinq() { XDocument xmlDoc = XDocument.Load("logCurves.xml"); return xmlDoc.Descendants("logCurveInfo") .Select(curveElement => new LogCurve { Name = curveElement.Attribute("id").Value, MinValue = double.Parse(curveElement.Element("minValue").Value), MaxValue = double.Parse(curveElement.Element("maxValue").Value) }) .ToList(); }
几个注意点:
- 确保你的
LogCurve类有公开的Name、MinValue、MaxValue属性,并且有无参构造函数 - 如果XML里的数值可能存在格式问题(比如非数字字符),建议用
double.TryParse替代double.Parse,避免运行时异常 - 记得添加对应的命名空间引用:XmlReader方式需要
using System.Xml;,LINQ to XML方式需要using System.Xml.Linq;
内容的提问来源于stack exchange,提问作者paparazzo
相关产品推荐
相关产品推荐

