десериализовать xml в список <t> - PullRequest
0 голосов
/ 28 ноября 2011

Я искал навсегда, пытаясь выяснить, что я делаю неправильно, пытаясь десерализовать некоторые XML в список. Я могу получить десерилизацию всего, кроме ответов, так что десерилизация работает, но, похоже, я что-то упускаю в украшениях класса. Ответы отображаются в «testObj», но являются нулевыми.

Любая помощь приветствуется.

Образец XML

<?xml version="1.0" encoding="utf-8" ?>
<TestObj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<question>
    <stem>this is the question stem</stem>
    <answers>
      <answer>answer 1</answer>
      <answer>answer 2</answer>
      <answer>answer 3</answer>
      <answer>answer 4</answer>
 </question>
 <question .... </question>
 <question .... </question>
 <question .... </question>
</TestObj>

[Serializable]
    public class TestObj
    {
        [XmlElement(ElementName = "question")]
        [XmlElement(typeof(QuestionObj))]
        public List<QuestionObj> Questions { get; set; }

        public int Id { get; set; }
        public string Name;
    }

[Serializable]
    public class QuestionObj
    {
        [XmlElement(ElementName = "stem")]
        public string Stem { get; set; }


        [XmlArray("answers")]
        [XmlArrayItem(ElementName = "answer")]
        [XmlArrayItem(typeof(AnswerObj))]
        public List<AnswerObj> Answers { get; set; }

        public int TestId { get; set; }
        public int Id { get; set; }
    }

[Serializable]
   public class AnswerObj
    {
        [XmlElement(ElementName = "answer")]
        public string Answer { get; set; }

       public int Id { get; set; }
       public int StemId { get; set; }
    }

Object returned:
Question:this is the question stem
   answers
      answer:null
      answer null;
etc

Ответы [ 4 ]

2 голосов
/ 28 ноября 2011

Ваши атрибуты сериализации заставляют сериализатор выглядеть для структуры xml следующим образом:

<question>
  <answers>
    <answer>
      <answer>answer text</answer>
      <Id>1234</Id>
      <StemId>1234</StemId>
    </answer>
  </answers>
</question>

Вы можете либо изменить сериализатор, чтобы использовать List<string> для ответов, либо создать AnswerObj в xml для каждогоответ (как указано выше).

1 голос
/ 28 ноября 2011

Вот хороший пример от Марка Гравелла здесь :

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

[XmlRoot("user_list")]
public class UserList
{
    public UserList() {Items = new List<User>();}

    [XmlArray("Items")]
    [XmlArrayItem("User", typeof(User))]
    public List<User> Items {get;set;}
}
public class User
{
    [XmlElement("id")]
    public Int32 Id { get; set; }

    [XmlElement("name")]
    public String Name { get; set; }
}

static class Program
{
    static void Main()
    {
        XmlSerializer ser= new XmlSerializer(typeof(UserList));
        UserList list = new UserList();
        list.Items.Add(new User { Id = 1, Name = "abc"});
        list.Items.Add(new User { Id = 2, Name = "def"});
        list.Items.Add(new User { Id = 3, Name = "ghi"});
        ser.Serialize(Console.Out, list);
    }
}
0 голосов
/ 28 ноября 2011

Извините, но мне нужно спросить. Вы правильно инициализируете AnswerObj и устанавливаете в нем ответ? В XmlArrayItem вы получите другой объект, а не просто строковый ответ.

0 голосов
/ 28 ноября 2011

Чтобы получить ожидаемый XML-файл, попробуйте это:

[Serializable]
    public class TestObj
    {
        [XmlElement(ElementName = "question")]
        [XmlElement(typeof(QuestionObj))]
        public List<QuestionObj> Questions { get; set; }

        public int Id { get; set; }
        public string Name;
    }

[Serializable]
    public class QuestionObj
    {
        [XmlElement(ElementName = "stem")]
        public string Stem { get; set; }


        [XmlElement("answers")]
        public List<AnswerObj> Answers { get; set; }

        public int TestId { get; set; }
        public int Id { get; set; }
    }

[Serializable]
   public class AnswerObj
    {
        [XmlElement(ElementName = "answer")]
        public string Answer { get; set; }

       public int Id { get; set; }
       public int StemId { get; set; }
    }
...