如何在具有相同类型的子节点的c#中反序列化XML

时间:2017-12-12 05:40:10

标签: c# xml xml-serialization xml-deserialization

我需要反序列化下面的XML。 chapter元素中可以包含多个子chapter元素。我试图使用XmlSerializer反序列化XML。 所有元素都按预期反序列化,但问题是子子数组没有反序列化,我在这里遗漏了什么?请帮忙。

<Survey>
        <SurveyResults>
            <Subject>
                <Chapter>
                    <ChapterIterationName />
                    <Questions />
                    <Chapter>
                        <ChapterName>CHAPTER 1</ChapterName>
                        <ChapterIterationName />
                        <Questions>
                            <Question>
                                <Text>Question 1</Text>
                            </Question>
                            <Question>
                                <Text>Question 2</Text>
                            </Question>
                        </Questions>
                        <Chapter>
                            <ChapterName>CHAPTER 1.1</ChapterName>
                            <ChapterIterationName />
                            <Questions>
                                <Question>
                                    <Text>Questoin 1</Text>
                                </Question>
                                <Question>
                                    <Text>Questoin 2</Text>
                                </Question>
                            </Questions>
                        </Chapter>
                        <Chapter>
                            <ChapterName>CHAPTER 1.2</ChapterName>
                            <ChapterIterationName />
                            <Questions>
                                <Question>
                                    <Text>Questoin 1</Text>
                                </Question>
                                <Question>
                                    <Text>Questoin 2</Text>
                                </Question>
                            </Questions>
                        </Chapter>
                    </Chapter>
                </Chapter>
            </Subject>
        </SurveyResults>
    </Survey>

这是我尝试过的代码。

public class Survey
    { 
        public SurveyResults SurveyResults { get; set; }
    }

    public class SurveyResults
    {
        public Subject Subject { get; set; }
    }

    public class Subject
    { 
        public List<Chapter> Chapter { get; set; }
    }

    public class Chapter
    {
        public string ChapterName { get; set; }
        public string ChapterIterationName { get; set; }

        [XmlArray("Chapter")]
        public List<Chapter> Chapters { get; set; }
        public List<Questions> Questions { get; set; }
    }

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

    public class Question
    {
        public string Text { get; set; } 
    }

    public class Serializer
    { 
        public T Deserialize<T>(string input) where T : class
        {
            System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

            using (StringReader sr = new StringReader(input))
            {
                return (T)ser.Deserialize(sr);
            }
        }
    }

    Serializer ser = new Serializer();
    Survey survey = ser.Deserialize<Survey>(xlString);

结果 Output

1 个答案:

答案 0 :(得分:1)

<强> [编辑]

经过如此多的编辑后,我找到了解决这个问题的简单方法:

  1. 复制XML文件内容。
  2. 从Visual Studio菜单中选择编辑 - &gt;选择性粘贴 - &gt;将XML粘贴为类
  3. 使用反序列化代码。

        string path = @"G:\Projects\StackOverFlow\WpfApp1\Survey.xml";
        FileStream reader = File.OpenRead(path);
        XmlSerializer ser = new XmlSerializer(typeof(Survey));
        Survey survey = (Survey)ser.Deserialize(reader);