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

C#如何读取所有属性写在单行的XML节点数据

C# 读取属性式XML节点的实现方案

两种XML结构的核心差异是值存储位置不同:子节点存值时需要读取节点的InnerText属性,字段存在节点属性上时,直接读取节点的Attributes集合即可,以下两种实现都可以完全匹配你预期的遍历、索引调用逻辑。


方案1:LINQ to XML(推荐,代码最简)

适用于.NET Framework 3.5+、.NET Core/.NET 5+所有现代版本,调用逻辑和你预期的写法几乎一致:

  1. 先引入所需命名空间
using System.Xml.Linq;
using System.Linq;
  1. 读取XML并解析为可索引、可遍历的节点集合
// 从文件加载XML,若处理XML字符串直接调用 XDocument.Parse(你的xml字符串) 即可
XDocument xDoc = XDocument.Load("目标XML文件路径.xml");
// 按文档顺序取出所有Area节点,存为支持索引访问的集合
var areas = xDoc.Descendants("Area").ToList();

// 按索引读取指定节点属性
string mySetNr_0 = areas[0].Attribute("SetNr")?.Value;
double myX1_0 = double.Parse(areas[0].Attribute("X1")?.Value ?? "0");

// 遍历读取所有节点
foreach (var area in areas)
{
    int setNr = int.Parse(area.Attribute("SetNr")?.Value ?? "0");
    double x1 = double.Parse(area.Attribute("X1")?.Value ?? "0");
    double y1 = double.Parse(area.Attribute("Y1")?.Value ?? "0");
    double x2 = double.Parse(area.Attribute("X2")?.Value ?? "0");
    double y2 = double.Parse(area.Attribute("Y2")?.Value ?? "0");
    double peak = double.Parse(area.Attribute("Peak")?.Value ?? "0");
    double peakArea = double.Parse(area.Attribute("PeakArea")?.Value ?? "0");
    double deltaH = double.Parse(area.Attribute("DeltaH")?.Value ?? "0");
    // 解析完成后存入自定义类、列表做后续处理即可
}

如果想实现完全的强类型访问,直接通过area.X1这类写法调用属性,可以用XML反序列化一次性映射为自定义类集合,不需要手动逐字段解析:

使用该方法需要先引入命名空间:using System.Xml.Serialization;

// 定义和XML字段对应的实体类,标注属性匹配关系
public class Area
{
    [XmlAttribute("SetNr")]
    public int SetNr { get; set; }
    [XmlAttribute("X1")]
    public double X1 { get; set; }
    [XmlAttribute("Y1")]
    public double Y1 { get; set; }
    [XmlAttribute("X2")]
    public double X2 { get; set; }
    [XmlAttribute("Y2")]
    public double Y2 { get; set; }
    [XmlAttribute("Peak")]
    public double Peak { get; set; }
    [XmlAttribute("PeakArea")]
    public double PeakArea { get; set; }
    [XmlAttribute("DeltaH")]
    public double DeltaH { get; set; }
}

// 一行代码完成反序列化,得到强类型集合
XmlSerializer serializer = new XmlSerializer(typeof(List<Area>), new XmlRootAttribute("Areas"));
List<Area> areaList;
using (FileStream fs = new FileStream("目标XML文件路径.xml", FileMode.Open))
{
    areaList = (List<Area>)serializer.Deserialize(fs);
}

// 调用方式完全匹配你的预期
var firstAreaSetNr = areaList[0].SetNr;
foreach (var item in areaList)
{
    var currentPeak = item.Peak;
}

方案2:XmlDocument 方式(兼容旧版.NET框架)

如果你的项目基于较早的.NET Framework版本,无法使用LINQ to XML,可以用原生XmlDocument接口读取:

// 引入命名空间 using System.Xml;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("目标XML文件路径.xml");
XmlNodeList areaNodes = xmlDoc.GetElementsByTagName("Area");

// 按索引读取
string setNr0 = areaNodes[0].Attributes["SetNr"].Value;
// 遍历读取
foreach (XmlNode area in areaNodes)
{
    string setNr = area.Attributes["SetNr"].Value;
    string x1 = area.Attributes["X1"].Value;
    // 其余字段读取逻辑一致,按需做类型转换即可
}

提示:你给出的XML示例中属性值外层包裹的双引号是格式冗余,解析时Value属性会自动去除外层包裹的引号,不需要额外做字符串裁剪处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:21:25