gpt4 book ai didi

C# 将 XML 反序列化为 ChildClasses 列表

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:22 25 4
gpt4 key购买 nike

我有一个来自第三方软件的 XML,我必须反序列化,但我有 XML 的规范。

在某个时刻,我有一个节点,其中包含一堆不同类型的不同节点。我必须将这个节点(车辆)反序列化为一个列表。每个子节点都是 Vehicle 类的一个子类

public List<Vehicle> Vehicles = new List<Vehicles>();

类的定义如下

public class Vehicle
{
public string Vehicletype { get; set; }

public virtual bool Drive() { return true; }
}

public class Car:Vehicle
{
public int NumberOfDoors { get; set; }

public override bool Drive() { return false; }
}

public class Boat:Vehicle
{
public int NumberOfSeats { get; set; }
}

XML 的定义如下所示

<vehicles>
<car NumberOfDoors="4" />
<car NumberOfDoors="3" />
<boat NumberOfSeats="1024" />
<boat NumberOfSeats="20" />
<car NumberOfDoors="5" />
</vehicles>

在某个时候我必须循环遍历它们并让它们“驱动”。我没有使用 XMLSchema 定义的经验。现在我在工厂和其他一些东西中使用 vehicleType。它基本上变得一团糟。

我需要一个建议,如何让 Serializer 代替我来做这件事。我怀疑我是第一个遇到这个问题的人。

最佳答案

首先,你必须标记NumberofSeatsNumberOfDoors XmlAttribute 属性告诉XmlSerializer这些属性应显示为 XML 属性:

public class Car : Vehicle
{
[XmlAttribute]
public int NumberOfDoors { get; set; }

public override bool Drive() { return false; }
}

public class Boat : Vehicle
{
[XmlAttribute]
public int NumberOfSeats { get; set; }
}

接下来,如果<vehicles>在包含 root element 的部分中显示为 XML 节点, 你可以让你的 public List<Vehicle> Vehicles作为相应容器类中的成员出现,并应用 XmlArray 赋予它的属性表明列表应该在两个级别序列化,并且 XmlArrayItem 通知属性XmlSerializer列表中可能遇到的车辆的可能性以及用于每个车辆的开始标记:

public class VehiclesContainer // Your container class
{
[XmlArray("vehicles")]
[XmlArrayItem("vehicle", typeof(Vehicle))]
[XmlArrayItem("car", typeof(Car))]
[XmlArrayItem("boat", typeof(Boat))]
public List<Vehicle> Vehicles = new List<Vehicle>();
}

另一方面,<vehicles>是XML文档的根节点,没有包含节点,可以引入一个包含车辆列表的根节点类,然后应用多个 XmlElement 指示列表应在一级而不是两级序列化的属性以及用于每种可能的车辆类型的开始标记:

[XmlRoot("vehicles")]
public class VehicleList
{
[XmlElement("vehicle", typeof(Vehicle))]
[XmlElement("car", typeof(Car))]
[XmlElement("boat", typeof(Boat))]
public List<Vehicle> Vehicles = new List<Vehicle>();
}

完成后,XmlSerializer将自动反序列化您的类层次结构。

有关详细信息,请参阅 here .

关于C# 将 XML 反序列化为 ChildClasses 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com