XML反序列化{“缺少根元素。”}错误

时间:2016-01-18 17:03:58

标签: c# .net xml

我正在向我的解决方案添加一个新项目,并添加了下面发布的代码。 LoadXML()方法,变量设置和文件反序列化完全按照我在整个解决方案中的其他几次完成,但突然之间现在突然出现这个令人烦恼的“{”Root元素丢失了。“}”错误 - 即使没有XML存在,或者当我使用不同的XML时,我也知道有效。这对我来说意味着错误显然在代码中,但由于代码几乎是从我以前的文件传输中复制的,我不知道它是怎么回事。之前在本网站发布的此错误的其他情况并不符合我的情况,所以我开始了一个新的,希望我可以接近答案!

    //fileName and XML variables for serialization/deserialization
    const string fileName = "SimulatedTrain1.xml";
    XmlSerializer xml = new XmlSerializer(typeof(BindingList<SimulatedTrain>));

    //Create BindingList object to hold XML data
    public BindingList<SimulatedTrain> SimulatedTrain = new BindingList<SimulatedTrain>();

    public void LoadXML()
    {
        try
        {
            using (var fs = new FileStream(fileName, FileMode.OpenOrCreate))
            {
                var tempTrain = (BindingList<SimulatedTrain>)xml.Deserialize(fs);
                SimulatedTrain = tempTrain;
            }                
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message, ex);
        }
    }

在form_load

上调用LoadXML()

编辑:这是我的XML文件的一部分(其余部分基本上是重复数据)

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,通过选择"Copy to Output Directory" to be "Copy always"确保将XML文件复制到构建目录中。

假设文件存在,则在反序列化XML文件时可能会出现类型转换错误。

以下作品:

SimulatedTrain.cs:

[XmlRoot("ArrayOfSimulatedRailCar")]
public class SimulatedTrain
{
    [XmlElement("SimulatedRailCar")]
    public List<SimulatedRailCar> Cars { get; set; }
}

SimulatedRailCar.cs:

public class SimulatedRailCar
{
    string Name { get; set; }
    // More properties here...
}

TrainProg.cs:

const string fileName = "SimulatedTrain1.xml";
XmlSerializer xml = new XmlSerializer(typeof(SimulatedTrain));

public SimulatedTrain SimulatedTrain;

public void LoadXML()
{
    Contract.Assert(File.Exists(fileName));

    try
    {
        using (var fs = new FileStream(fileName, FileMode.Open))
        {
            SimulatedTrain = (SimulatedTrain)xml.Deserialize(fs);
        }                
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message, ex);
    }
}