2016-01-18 4 views
0

Я добавляю новый проект в свое решение и добавил код, указанный ниже. Метод LoadXML(), настройка переменных и десериализация файлов выполняются точно так же, как я сделал это несколько раз в течение этого решения, но теперь вдруг для этой части он бросает этот раздражающий «{« Корневой элемент отсутствует ».}« Error - даже когда XML отсутствует или я использую другой XML, который я знаю, работает. Это означает, что ошибка явно находится в коде, но поскольку код почти скопирован с копий из моих предыдущих передач файлов, я не знаю, как это может быть. Другие ситуации для этой ошибки, ранее размещенные на этом веб-сайте, действительно не соответствуют моей ситуации, поэтому я начал новую в надежде, что смогу приземлиться ближе к ответу!XML Deserialization {«Отсутствует элемент корня.»} Ошибка

//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); 
     } 
    } 

LoadXML() вызывается на Form_Load

Edit: Вот часть моего файла XML (остальные в основном повторяют данные)

enter image description here

+4

Можете ли вы показать нам свою ' SimulatedTrain1.xml'? – minghan

+0

Бросил его туда, чтобы вы его увидели! –

+0

возможно, попробуйте 'FileMode.Open' вместо' OpenOrCreate'? – terbubbs

ответ

0

Во-первых, убедитесь, что файл XML скопирован в ваш каталог сборки, выбрав "Copy to Output Directory" to be "Copy always".

Предполагая, что файл существует, вероятно, у вас есть ошибка преобразования типа при десериализации файла 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); 
    } 
} 
+0

Это был интересный подход, чтобы попробовать. После имитации этой установки я заметил изменение; однако я не могу сказать, было ли это обязательно к лучшему: теперь я получаю сообщение о том, что в (2,2) вместо (0,0) есть ошибка, и говорит: «

+0

Как и в моем коде, вы должны установить XmlRoot в ArrayOfSimulatedRailCar. Кроме того, удалите материал 'xmlns' в вашем XML-файле, чтобы он читал' '. – minghan

Смежные вопросы