定义用于读取XML数据的数据结构

时间:2017-11-15 09:49:13

标签: xml c#-4.0 xmlserializer

我正在尝试从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();

我基本上想要检索车辆,然后循环每辆车,并检索相关的Motor和GearBox。我不确定,如何使用我的XMLAttributor(或)XMLElement检索螺母,螺钉和螺栓等数据数据结构。

提前致谢!

2 个答案:

答案 0 :(得分:0)

你说你有多辆车,所以你需要做好准备:

var cars = (IEnumerable<Vehicle>)serializer.Deserialize(reader);

除此之外......看起来不错。

答案 1 :(得分:0)

如果您正在使用XML,那么创建对象的一种更简洁的方法是复制xml文本,然后在Visual Studio中转到edit-&gt; paste special-&gt;将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());
                }
            }
        }