【问题标题】:deserialize xml to list<t>将 xml 反序列化为列表<t>
【发布时间】:2012-01-08 02:37:42
【问题描述】:

我一直在搜索,试图找出我在尝试将某些 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

【问题讨论】:

  • 你用什么反序列化?
  • 回答者是否应该假设&lt;answers&gt; 的结束标签?

标签: c# xml-serialization


【解决方案1】:

这是 Marc Gravell here 的一个很好的例子:

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

【讨论】:

  • 这是一个很好的序列化示例 - 但没有说明为什么我的反序列化不起作用 - 当使用此模型时,答案只显示 1 个答案 - 有什么建议吗?
  • 尝试改用XmlArrayXmlArrayItem 属性。
【解决方案2】:

您的序列化属性使序列化程序寻找这样的 xml 结构:

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

您可以将序列化程序更改为使用List&lt;string&gt; 作为答案,或者在 xml 中为每个答案构建一个 AnswerObj(如上所述)。

【讨论】:

  • 谢谢 - 这就是问题所在,我花了很长时间才看到它 - 似乎我无法奖励积分,因为我的声望不够高
【解决方案3】:

要获得你期望的 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; }
    }

【讨论】:

    【解决方案4】:

    对不起,我需要问一下。您是否正确初始化了 AnswerObj,并在其中设置了答案? 在 XmlArrayItem 中,您将在其中获得另一个对象,而不仅仅是字符串答案。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多