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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:09:49