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

How to Deserialize XML in c# having child nodes of same type

我需要反序列化波纹管 XML。 it.I 中的章节元素可以有多个子章节元素已尝试使用 XmlSerializer 反序列化 XML。 所有元素都按预期反序列化,但问题是子 Chapter 数组没有反序列化,我在这里遗漏了什么吗?请帮忙。

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

结果

[编辑]

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

  1. 复制你的XML文件内容。
  2. 来自 Visual Studio 菜单 select 编辑 -> 选择性粘贴 -> 粘贴 XML 为 类.
  3. 使用反序列化代码。

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