简体   繁体   中英

How to Deserialize XML in C#

I have xml document copied from here How to Deserialize XML document

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>
</CarCollection>

I use that code with class generated from /paste special/paste xml as classes

using System;
using System.IO;
using System.Xml.Serialization;

namespace DeSerialize
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlSerializer serializer =
        new XmlSerializer(typeof(CarCollectionCar));

            // Declare an object variable of the type to be deserialized.
            CarCollectionCar i;

            using (Stream reader = new FileStream("cars.xml", FileMode.Open))
            {
                // Call the Deserialize method to restore the object's state.
                i = (CarCollectionCar)serializer.Deserialize(reader);
            }

            // Write out the properties of the object.
            Console.Write(
            // i.StockNumber + "\t" +
            i.StockNumber + "\t" +
            //i.StockNumber + "\t" +
            i.Model + "\t" +
            i.Make);


        }
    }


    [Serializable()]
    public partial class CarCollection
    {

        /// <remarks/>
        [XmlArrayItem("Car", IsNullable = false)]
        public CarCollectionCar[] Cars { get; set; }
    }

    /// <remarks/>
    [Serializable()]
    [System.ComponentModel.DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    public partial class CarCollectionCar
    {

        /// <remarks/>
        public ushort StockNumber { get; set; }

        /// <remarks/>
        public string Make { get; set; }

        /// <remarks/>
        public string Model { get; set; }
    }


}

I get error

Unhandled Exception: System.InvalidOperationException: There is an error in XML 
document (2, 2). ---> System.InvalidOperationException: <CarCollection xmlns=''> 
was not expected.
       at 
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCarCollectionCar.Read3_CarCollectionCar()
       --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
   at DeSerialize.Program.Main(String[] args)

How to resolve problem and output needed Cars params?

It's because it can't understand CarCollection on line two of your XML.

Object is CarCollection.Cars[Car]

Best way might be to build an object of car collections and serialise this into XML and see what it outputs from there. Once you can serialise it to xml then deserialising into objects is fairly easy.

Or you could deserialise into a dynamic C# object and see what object it builds.

But this code will work to deserialise

This code will work though as objects match the xml

class Program
{
    static void Main(string[] args)
    {
        XmlSerializer serializer =
    new XmlSerializer(typeof(CarCollection));

        // Declare an object variable of the type to be deserialized.
        CarCollection i;

        using (Stream reader = new FileStream("cars.xml", FileMode.Open))
        {
            // Call the Deserialize method to restore the object's state.
            i = (CarCollection)serializer.Deserialize(reader);
        }

        // Write out the properties of the object.
       // Console.Write(
        // i.StockNumber + "\t" +
       /// i.StockNumber + "\t" +
        //i.StockNumber + "\t" +
       // i.Model + "\t" +
       // i.Make);

    }
}

[Serializable()]
public partial class CarCollection
{

    /// <remarks/>
    [XmlArrayItem("Car", IsNullable = false)]
    public Car[] Cars { get; set; }
}

/// <remarks/>
[Serializable()]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public partial class Car
{
    /// <remarks/>
    public ushort StockNumber { get; set; }

    /// <remarks/>
    public string Make { get; set; }

    /// <remarks/>
    public string Model { get; set; }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM