使用XmlReader和xsd.exe中的类反序列化Xml

好的,我在尝试学习XmlSerializer的过程中遇到了一些障碍。 我已经遵循了所有建议的步骤,但我的程序没有返回任何内容,或者返回null。 我创建了一个XML文件,如下所示:

                            

然后我使用xsd.exe生成.xsd文件,它是:

                              

创建架构后,我再次使用xsd.exe为我自动生成类,即:

 ///  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] public partial class WeeklyJobs { private WeeklyJobsDailyJobs[] itemsField; ///  [System.Xml.Serialization.XmlElementAttribute("DailyJobs", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public WeeklyJobsDailyJobs[] Items { get { return this.itemsField; } set { this.itemsField = value; } } } ///  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class WeeklyJobsDailyJobs { private WeeklyJobsDailyJobsJobsJob[][] jobsField; private string dateField; private string totalJobsField; ///  [System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] [System.Xml.Serialization.XmlArrayItemAttribute("Job", typeof(WeeklyJobsDailyJobsJobsJob), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] public WeeklyJobsDailyJobsJobsJob[][] Jobs { get { return this.jobsField; } set { this.jobsField = value; } } ///  [System.Xml.Serialization.XmlAttributeAttribute()] public string Date { get { return this.dateField; } set { this.dateField = value; } } ///  [System.Xml.Serialization.XmlAttributeAttribute()] public string TotalJobs { get { return this.totalJobsField; } set { this.totalJobsField = value; } } } ///  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class WeeklyJobsDailyJobsJobsJob { private string jobNameField; private string descriptionField; ///  [System.Xml.Serialization.XmlAttributeAttribute()] public string JobName { get { return this.jobNameField; } set { this.jobNameField = value; } } ///  [System.Xml.Serialization.XmlAttributeAttribute()] public string Description { get { return this.descriptionField; } set { this.descriptionField = value; } } } 

在此之后,我将.CS文件添加到我的项目中,并创建了一个带有TextBox的简单winform,以便在我对某些xml进行反序列化后显示一些数据。 就像我说程序启动一样,TextBox中没有显示任何内容,也没有抛出exception。 这是我的winform:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string getExample() { XmlSerializer serializer = new XmlSerializer(typeof(WeeklyJobs)); WeeklyJobs jobs; string xml = @"" + @"" + @"" + @"" + @"" + @"" + @"" + @"" + @"" + @""; // Create an XmlTextReader using (XmlReader reader = XmlReader.Create(new StringReader(xml))) { jobs = (WeeklyJobs)serializer.Deserialize(reader); } return jobs.Items[0].Date; } private void Form1_Load(object sender, EventArgs e) { textBox1.Text = getExample(); } } 

我有更简单的xml示例可以工作,但我第二次尝试为我的xml添加一些复杂性我失败了。 我必须弄清楚如何使用我在这里的xml。 我很感激帮助! 感谢大家!

好吧,第一个问题是XmlSerializer构造函数正在引发一个未处理的exception,但这是以某种方式被吞噬。 这解释了文本框为空的原因。 我将调试器设置为中断所有CLRexception,并发现构造函数抛出了InvalidOperationException – 显然是在代码生成过程中:

无法生成临时类(result = 1)。

错误CS0030:无法将类型’DeleteMe.WeeklyJobsDailyJobsJobsJob []’转换为’DeleteMe.WeeklyJobsDailyJobsJobsJob’

错误CS0029:无法将类型’DeleteMe.WeeklyJobsDailyJobsJobsJob’隐式转换为’DeleteMe.WeeklyJobsDailyJobsJobsJob []’

(构造函数也抛出了一个FileNotFoundexception,但它也会处理它,所以你可以忽略它。)

似乎问题是锯齿状数组 – 你是否将1维数组更改为锯齿状数组? 当然,错误消息指出了我的方向,但我也从未在xsd生成的代码中看到过锯齿状数组,因此看起来很可疑。 我将WeeklyJobsDailyJobsJobsJob[][]两次出现更改为WeeklyJobsDailyJobsJobsJob[]并且应用程序工作得很好。

另外,您应该使用DateTime作为日期,但XML序列化程序不支持可变日期格式(请参阅https://stackoverflow.com/a/1118855/385844 )。 如果您无法控制源,那么在将字符串存储到数据库或任何地方之前,最好将字符串转换为日期。