定义读取 XML 数据的数据结构
Defining the data structure for reading the XML Data
我正在尝试从 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:\Users\Semantics\Desktop\New.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));
var reader = XmlReader.Create(path);
cars = (Vehicle)serializer.Deserialize(reader);
reader.Close();
我基本上想检索车辆,然后遍历每辆车,检索关联的电机,GearBox.I 不确定,如何使用 [=26 检索螺母、螺钉和螺栓等数据=]我的数据结构中的属性(或)XML元素。
提前致谢!
你说你有多辆车,所以你需要为此做好准备:
var cars = (IEnumerable<Vehicle>)serializer.Deserialize(reader);
除此之外……看起来不错。
如果您使用 XML 创建对象的一种更简洁的方法是复制 xml 文本,然后在 Visual Studio 中转到编辑->选择性粘贴->将 XML 粘贴为 类。这样,如果您的结构发生变化,您可以重复该过程来更新您的对象 类。考虑到您当前的 xml,并考虑到基于您的 xml 结构可能有不止 1 个车辆、电机和变速箱,这就是我得到的,对象模型:
[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());
}
}
}
我正在尝试从 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:\Users\Semantics\Desktop\New.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Vehicle));
var reader = XmlReader.Create(path);
cars = (Vehicle)serializer.Deserialize(reader);
reader.Close();
我基本上想检索车辆,然后遍历每辆车,检索关联的电机,GearBox.I 不确定,如何使用 [=26 检索螺母、螺钉和螺栓等数据=]我的数据结构中的属性(或)XML元素。
提前致谢!
你说你有多辆车,所以你需要为此做好准备:
var cars = (IEnumerable<Vehicle>)serializer.Deserialize(reader);
除此之外……看起来不错。
如果您使用 XML 创建对象的一种更简洁的方法是复制 xml 文本,然后在 Visual Studio 中转到编辑->选择性粘贴->将 XML 粘贴为 类。这样,如果您的结构发生变化,您可以重复该过程来更新您的对象 类。考虑到您当前的 xml,并考虑到基于您的 xml 结构可能有不止 1 个车辆、电机和变速箱,这就是我得到的,对象模型:
[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());
}
}
}