C#如何读取所有属性写在单行的XML节点数据
C# 读取属性式XML节点的实现方案
两种XML结构的核心差异是值存储位置不同:子节点存值时需要读取节点的InnerText属性,字段存在节点属性上时,直接读取节点的Attributes集合即可,以下两种实现都可以完全匹配你预期的遍历、索引调用逻辑。
方案1:LINQ to XML(推荐,代码最简)
适用于.NET Framework 3.5+、.NET Core/.NET 5+所有现代版本,调用逻辑和你预期的写法几乎一致:
- 先引入所需命名空间
using System.Xml.Linq; using System.Linq;
- 读取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
相关产品推荐
相关产品推荐

