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

如何将非典型结构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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:22:55