C# XML反序列化规则

C# XML反序列化规则,c#,xml,deserialization,C#,Xml,Deserialization,我需要以这种方式反序列化xml文件及其结构: <NPCs> <LabAssistant1> <Questions> <Question> <Type>CheckBox</Type> <Points>10</Points> <Text>Q1</Text>

我需要以这种方式反序列化xml文件及其结构:

<NPCs>
   <LabAssistant1>
      <Questions>
         <Question>
            <Type>CheckBox</Type>
            <Points>10</Points>
            <Text>Q1</Text>
            <Answers>
               <Answer>
                  <Correct>False</Correct>
                  <Text>A1</Text>
               </Answer> 
               <Answer>
                  <Correct>True</Correct>
                  <Text>A2</Text>
               </Answer> 
               <Answer>
                  <Correct>False</Correct>
                  <Text>A3</Text>
               </Answer> 
            </Answers>
         </Question>
      </Questions>
   </LabAssistant1>

   <LabAssistant2>
      <Questions>
          ...
      </Questions>
   </LabAssistant2>
</NPCs>
上面的代码应该以数组的形式输出2个问题对象,但它没有

下面是课堂问答,我的附加属性有什么问题吗

public class Question
{

    [XmlElement(ElementName="Text")]
    public String Text { get;  set; }
    [XmlArray(ElementName = "Answers")]
    public Answer[] Answers { get;  set; }
    [XmlElement(ElementName = "Type")]
    public QuestionType Type { get;  set; }
    [XmlElement(ElementName = "Points")]
    public int Points { get; set; }
    public Question()
    {

    }
    public Question(String text, Answer[] answers, QuestionType type,int points)
    {
        this.Text = text;
        this.Answers = answers;
        this.Type = type;
        this.Points = points;
    }
}

public class Answer
{
    [XmlElement(ElementName="Text")]
    public String Text { get; set; }
    [XmlElement(ElementName = "Correct")]
    public bool Correct { get; set; }
    public Answer()
    {

    }
    public Answer(String text, bool correct)
    {
        this.Text = text;
        this.Correct = correct;
    }
}
您可以使用
XmlSerializer
事件将所有实验室助理加载到内存中,如下所示:

public class LabAssistant
{
    static XmlSerializer listSerializer;

    static LabAssistant()
    {
        // This must be cached to prevent memory & resource leaks.
        // See http://msdn.microsoft.com/en-us/library/System.Xml.Serialization.XmlSerializer%28v=vs.110%29.aspx
        listSerializer = new XmlSerializer(typeof(List<Question>), new XmlRootAttribute("Questions"));
    }

    public List<Question> Questions { get; set; }

    public static bool TryDeserializeFromXml(XmlElement element, out string name, out LabAssistant assistant)
    {
        name = element.Name;
        var child = element.ChildNodes.OfType<XmlElement>().Where(el => el.Name == "Questions").FirstOrDefault();
        if (child != null)
        {
            var list = child.OuterXml.LoadFromXML<List<Question>>(listSerializer);
            if (list != null)
            {
                assistant = new LabAssistant() { Questions = list };
                return true;
            }
        }
        assistant = null;
        return false;
    }
}

public class NPCs
{
    public NPCs()
    {
        this.LabAssistants = new Dictionary<string, LabAssistant>();
    }

    public static XmlSerializer CreateXmlSerializer()
    {
        // No need to cache this.
        var serializer = new XmlSerializer(typeof(NPCs));
        serializer.UnknownElement += new XmlElementEventHandler(NPCs.XmlSerializer_LoadLabAssistants);
        return serializer;
    }

    [XmlIgnore]
    public Dictionary<string, LabAssistant> LabAssistants { get; set; }

    public static void XmlSerializer_LoadLabAssistants(object sender, XmlElementEventArgs e)
    {
        var obj = e.ObjectBeingDeserialized;
        var element = e.Element;

        if (obj is NPCs)
        {
            var npcs = (NPCs)obj;
            string name;
            LabAssistant assistant;
            if (LabAssistant.TryDeserializeFromXml(element, out name, out assistant))
                npcs.LabAssistants[name] = assistant;
        }
    }
}

如果您没有键入错误的XML,并且它确实包含这种格式的布尔值,您将需要手动处理这些字段。

我需要创建
QuestionCollection
类来保存问题数组(具有
typeof(Question[])
抛出
你为什么不试试看呢?因为我认为序列化程序足够聪明,但我一直坚持在问题答案数组中添加什么属性?他们应该在你的问题中这样说。说出你尝试了什么;说出结果是什么;说出你想要的结果是什么。谢谢你的努力,b但我想出来了哦,是的,谢谢你的小写布尔值!
public class LabAssistant
{
    static XmlSerializer listSerializer;

    static LabAssistant()
    {
        // This must be cached to prevent memory & resource leaks.
        // See http://msdn.microsoft.com/en-us/library/System.Xml.Serialization.XmlSerializer%28v=vs.110%29.aspx
        listSerializer = new XmlSerializer(typeof(List<Question>), new XmlRootAttribute("Questions"));
    }

    public List<Question> Questions { get; set; }

    public static bool TryDeserializeFromXml(XmlElement element, out string name, out LabAssistant assistant)
    {
        name = element.Name;
        var child = element.ChildNodes.OfType<XmlElement>().Where(el => el.Name == "Questions").FirstOrDefault();
        if (child != null)
        {
            var list = child.OuterXml.LoadFromXML<List<Question>>(listSerializer);
            if (list != null)
            {
                assistant = new LabAssistant() { Questions = list };
                return true;
            }
        }
        assistant = null;
        return false;
    }
}

public class NPCs
{
    public NPCs()
    {
        this.LabAssistants = new Dictionary<string, LabAssistant>();
    }

    public static XmlSerializer CreateXmlSerializer()
    {
        // No need to cache this.
        var serializer = new XmlSerializer(typeof(NPCs));
        serializer.UnknownElement += new XmlElementEventHandler(NPCs.XmlSerializer_LoadLabAssistants);
        return serializer;
    }

    [XmlIgnore]
    public Dictionary<string, LabAssistant> LabAssistants { get; set; }

    public static void XmlSerializer_LoadLabAssistants(object sender, XmlElementEventArgs e)
    {
        var obj = e.ObjectBeingDeserialized;
        var element = e.Element;

        if (obj is NPCs)
        {
            var npcs = (NPCs)obj;
            string name;
            LabAssistant assistant;
            if (LabAssistant.TryDeserializeFromXml(element, out name, out assistant))
                npcs.LabAssistants[name] = assistant;
        }
    }
}
public static class XmlSerializationHelper
{
    public static T LoadFromXML<T>(this string xmlString)
    {
        return xmlString.LoadFromXML<T>(new XmlSerializer(typeof(T)));
    }

    public static T LoadFromXML<T>(this string xmlString, XmlSerializer serial)
    {
        T returnValue = default(T);

        using (StringReader reader = new StringReader(xmlString))
        {
            object result = serial.Deserialize(reader);
            if (result is T)
            {
                returnValue = (T)result;
            }
        }
        return returnValue;
    }
}
              <Correct>False</Correct>
        String questionsPath = Application.dataPath + "/Resources/questions.xml";
        XmlReader reader=XmlReader.Create(new StreamReader(questionsPath));

        reader.ReadToDescendant("LabAssistant");
        reader.ReadToDescendant("Questions");

        XmlSerializer se = new XmlSerializer(typeof(QuestionCollection));
        QuestionCollection qc=(QuestionCollection)se.Deserialize(reader);
[XmlType("Questions")]
public class QuestionCollection
{
    [XmlElement("Question")]
    public Question[] Questions { get; set; }
    public QuestionCollection() { }
}
[XmlType("Question")]
public class Question
{
    [XmlElement("Text")]
    public String Text { get;  set; }

    [XmlArray("Answers")]
    public Answer[] Answers { get;  set; }

    [XmlElement("Type")]
    public QuestionType Type { get;  set; }

    [XmlElement("Points")]
    public int Points { get; set; }

    public Question() { }
}
[XmlType("Answer")]
public class Answer
{
    [XmlElement("Text")]
    public String Text { get; set; }

    [XmlElement("Correct")]
    public bool Correct { get; set; }

    public Answer() { }
}