如何将非典型结构XML转换为自定义Carpark类集合?
XML转换为自定义Carpark类集合的实现方法
原始XML结构
<Carpark> <Trucks> <Truck brand='Chrysler' kg='2100'/> </Trucks> <Cars> <Car brand='Mercedes' kg='1100'/> </Cars> <Tractors> <Tractor brand='John Deere' kg='1500'/> </Tractors> </Carpark>
目标Carpark类定义
public class Carpark { // Type可取值如Truck、Car public string Type { get; set; } public string Brand { get; set; } public int Weight { get; set; } }
问题分析
你当前的代码仅遍历了<Carpark>下的一级节点(<Trucks>、<Cars>等),但实际需要提取的是这些节点内部的车辆节点(<Truck>、<Car>等),需从车辆节点中获取名称、brand和kg属性来构造Carpark实例。
实现方法
以下提供两种实用的转换方式,适配不同代码习惯:
方式一:LINQ简洁写法
通过LINQ查询一次性完成转换,代码更紧凑:
XElement xElement = XElement.Load(filePath); IEnumerable<Carpark> carparkList = from groupNode in xElement.Elements() from vehicleNode in groupNode.Elements() select new Carpark { Type = vehicleNode.Name.LocalName, Brand = vehicleNode.Attribute("brand")?.Value, Weight = int.TryParse(vehicleNode.Attribute("kg")?.Value, out int w) ? w : 0 }; // 验证转换结果 foreach (var item in carparkList) { Console.WriteLine($"Type: {item.Type}, Brand: {item.Brand}, Weight: {item.Weight}"); }
方式二:分步循环写法(适配你原有代码结构)
如果更习惯分步处理逻辑,可采用嵌套循环遍历:
XElement xElement = XElement.Load(filePath); List<Carpark> carparkList = new List<Carpark>(); // 遍历车辆组节点(Trucks、Cars等) foreach (var groupNode in xElement.Elements()) { // 遍历组内的具体车辆节点 foreach (var vehicleNode in groupNode.Elements()) { var carparkItem = new Carpark(); // 提取节点名称作为Type字段 carparkItem.Type = vehicleNode.Name.LocalName; // 提取brand属性值 carparkItem.Brand = vehicleNode.Attribute("brand")?.Value; // 提取并转换kg属性为int,兼容属性缺失的情况 if (int.TryParse(vehicleNode.Attribute("kg")?.Value, out int weight)) { carparkItem.Weight = weight; } carparkList.Add(carparkItem); } } // 验证转换结果 foreach (var item in carparkList) { Console.WriteLine($"Type: {item.Type}, Brand: {item.Brand}, Weight: {item.Weight}"); }
关键细节说明
vehicleNode.Name.LocalName:获取车辆节点的本地名称(如Truck、Car),直接作为Type字段值。- 空传播运算符
?.:避免因属性不存在导致的空引用异常。 int.TryParse:相比直接int.Parse更安全,能处理kg属性缺失或格式错误的场景。
内容的提问来源于stack exchange,提问作者Cenderze
相关产品推荐
相关产品推荐

