我正在尝试从XML文件中读取数据,但无法继续。
这是我的XML文件:
<CollectionOfVehicles>
<Vehicle>
<Motors>
<Motor>
<Screw>100</Screw>
<Nut>200</Nut>
<Bolt>300</Bolt>
</Motor>
<Motor>
<Screw>100</Screw>
<Nut>200</Nut>
<Bolt>45</Bolt>
</Motor>
</Motors>
<GearBoxes>
<GearBox>
<gear>0</gear>
<Shaft>1</Shaft>
<Bearings>2</Bearings>
</GearBox>
</GearBoxes>
</Vehicle>
</CollectionOfVehicles>
我的数据结构如下:
public class Motor
{
public double Screw {get; set; }
public double Nut {get; set; }
public double Bolt {get; set; }
public Motor() {}
}
public class GearBox
{
public uint gear {get; set; }
public uint Shaft {get; set; }
public uint Bearings {get; set; }
public GearBox() {}
}
public class Vehicle
{
public List<Motor> motors {get; set;}
public List<GearBox> gearBoxes {get; set;}
public Vehicle() {}
};
**I tried to write the following lines of code to feed the XML Data:**
Vehicle cars = null;
string path = @"C:UsersSemanticsDesktopNew.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));
var reader = XmlReader.Create(path);
cars = (Vehicle)serializer.Deserialize(reader);
reader.Close();
我基本上,想要检索车辆,然后循环每辆车,并检索相关的电机和变速箱.我不确定,如何在我的数据结构中使用XMLAttributor(或(XMLElement检索螺母,螺钉和螺栓等数据。
提前感谢!
如果您使用的是XML,则创建对象的更简洁的方法是复制xml文本,然后在Visual Studio中转到编辑>粘贴特殊>将XML粘贴为类。这样,如果结构发生更改,则可以重复该过程以更新对象类。以您当前的 xml 为例,并考虑到根据您的 xml 结构可能有多个车辆、电机和变速箱,这就是我得到的,对象模型:
[Serializable]
public class CollectionOfVehicles
{
private Vehicle[] vehicleList;
[XmlElementAttribute("Vehicle")]
public Vehicle[] Vehicle { get { return this.vehicleList; } set { this.vehicleList = value; } }
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class Vehicle
{
private Motor[] motorList;
private GearBox[] gearBoxList;
[XmlArray("Motors")]
public Motor[] Motors { get { return this.motorList; } set { this.motorList = value; } }
[XmlArray("GearBoxes")]
public GearBox[] GearBoxes { get { return this.gearBoxList; } set { this.gearBoxList = value; } }
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class Motor
{
private double screwField;
private double nutField;
private double boltField;
public double Screw { get { return this.screwField; } set { this.screwField = value; } }
public double Nut { get { return this.nutField; } set { this.nutField = value; } }
public double Bolt { get { return this.boltField; } set { this.boltField = value; } }
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class GearBox
{
private uint gearField;
private uint shaftField;
private uint bearingsField;
public uint gear { get { return this.gearField; } set { this.gearField = value; } }
public uint Shaft { get { return this.shaftField; } set { this.shaftField = value; } }
public uint Bearings { get { return this.bearingsField; } set { this.bearingsField = value; } }
}
然后,在读取 XML 文件时,可以执行以下操作:
CollectionOfVehicles cars = null;
string path = @"test.xml";
XmlSerializer serializer = new XmlSerializer(typeof(CollectionOfVehicles));
using (var reader = XmlReader.Create(path))
{
cars = (CollectionOfVehicles)serializer.Deserialize(reader);
Console.WriteLine("Vehicles List Count: " + cars.Vehicle.Length.ToString());
Console.WriteLine(" ");
for (int i = 0; i < cars.Vehicle.Length; i++)
{
Console.WriteLine("Vehicle '" + i + "' Motors List Count: " + cars.Vehicle[i].Motors.Length.ToString());
for (int ii = 0; ii < cars.Vehicle[i].Motors.Length; ii++)
{
Console.WriteLine("Vehicle '" + i + "' Motor '" + ii + "' Data");
Console.WriteLine("Bolts: " + cars.Vehicle[i].Motors[ii].Bolt.ToString());
Console.WriteLine("Nut: " + cars.Vehicle[i].Motors[ii].Nut.ToString());
Console.WriteLine("Screws: " + cars.Vehicle[i].Motors[ii].Screw.ToString());
}
Console.WriteLine("Vehicle '" + i + "' GearBoxes List Count: " + cars.Vehicle[i].GearBoxes.Length.ToString());
for (int ii = 0; ii < cars.Vehicle[i].GearBoxes.Length; ii++)
{
Console.WriteLine("Vehicle '" + i + "' GearBox '" + ii + "' Data");
Console.WriteLine("Gear: " + cars.Vehicle[i].GearBoxes[ii].gear.ToString());
Console.WriteLine("Shaft: " + cars.Vehicle[i].GearBoxes[ii].Shaft.ToString());
Console.WriteLine("Bearings: " + cars.Vehicle[i].GearBoxes[ii].Bearings.ToString());
}
}
}
你说你有多辆车,所以你需要为此做好准备:
var cars = (IEnumerable<Vehicle>)serializer.Deserialize(reader);
除此之外...看起来不错。