Celdur Celdur - 2 months ago 27
C# Question

Parse XML file in Unity C#

I have a little problem with parsing XML file to object in C#. Whole project is in Unity3D. So I have this XML file:

<Questions>
<Question>
<questionText>What is this?</questionText>
<answer>blablabla</answer>
</Question>
</Questions>


And this is my parsing class:

using UnityEngine;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System;

public struct Montage {
[XmlElement("questionText")]
public string questionText;

[XmlElement("answer")]
public string answer;
}

[XmlRoot("Questions"), XmlType("Questions")]
public class ConfigScene {

[XmlArray("Questions")]
[XmlArrayItem("Question")]
public List<Montage> questions = new List<Montage> ();

public static ConfigScene Load(string path) {
try {
XmlSerializer serializer = new XmlSerializer (typeof(ConfigScene));
using(FileStream stream = new FileStream(path, FileMode.Open)) {
return serializer.Deserialize(stream) as ConfigScene;
}
} catch (Exception e) {
UnityEngine.Debug.LogError ("Exception loading config file: " + e);

return null;
}
}
}


I'm calling this "Load" method in camera Object in Start() method:

void Start () {
confScene = ConfigScene.Load(Path.Combine(Application.dataPath, "Config/config2.xml"));
foreach(Montage o in confScene.questions) {
Debug.Log (o.questionText);
}
}


The problem is that my questions list is empty and I didn't get any provided data into it. Do I make something wrong? Maybe someone made it before and know what is wrong with this code?

Answer

The XML file schema (config2.xml) and the XML serialization attributes in the corresponding class doesn't match. Your XML document's root element (Questions) and the questions list element are conflicting.

Change your XmlRoot's ElementName (which is now Questions, line 16 in code) to something else (say Root). Accordingly change your config2.xml file's content: enclose the entire document within a Root element as shown below.

<Root>
  <Questions>
    <Question>
      <questionText>What is this?</questionText>
      <answer>blablabla</answer>
    </Question>
  </Questions>
</Root>

Deserialization should be fine now.