如何在具有相同类型子节点的 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);
结果
[编辑]
经过多次编辑,我找到了解决这个问题的简单方法:
- 复制你的XML文件内容。
- 来自 Visual Studio 菜单 select 编辑 -> 选择性粘贴 -> 粘贴 XML 为 类.
使用反序列化代码。
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);
我需要反序列化波纹管 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);
结果
[编辑]
经过多次编辑,我找到了解决这个问题的简单方法:
- 复制你的XML文件内容。
- 来自 Visual Studio 菜单 select 编辑 -> 选择性粘贴 -> 粘贴 XML 为 类.
使用反序列化代码。
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);