从Web api反序列化XML数组

首先,我按照这里给出的答案,但我仍然无法得到以下工作。

我正在从Web API检索XML,返回的结果如下:

  000.000 AAA-000/L 01/01/2015 John Doe 000.000 
1
Summer 123456 John Doe 2015 000.000 AAA-000/L 01/01/2015 John Doe 000.000
1
Summer 123456 John Doe 2015

我正在尝试将其反序列化为一系列学生。 我的学生class级定义如下:

 public class Student { [System.Xml.Serialization.XmlElement("accumulated_tuiton")] public double AccumulatedTution { get; set; } [System.Xml.Serialization.XmlElement("net_tuiton")] public double NetTuiton { get; set; } [System.Xml.Serialization.XmlElement("course_id")] public string CourseID { get; set; } [System.Xml.Serialization.XmlElement("invoice_date")] public DateTime InvoiceDate { get; set; } [System.Xml.Serialization.XmlElement("lecturer_name")] public string LecturerName { get; set; } [System.Xml.Serialization.XmlElement("semester")] public string Semester { get; set; } [System.Xml.Serialization.XmlElement("student_id")] public string StudentId { get; set; } [System.Xml.Serialization.XmlElement("student_name")] public string StudentName { get; set; } [System.Xml.Serialization.XmlElement("year")] public string Year { get; set; } [System.Xml.Serialization.XmlElement("section_no")] public int Section { get; set; } } 

我的学生集合定义如下:

 [System.Xml.Serialization.XmlRoot("ArrayOf__ptd_student_charges xmlns=\"http://schemas.datacontract.org/2004/07/something.something\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance")] public class StudentCollection { [XmlArray("ArrayOf__ptd_student_charges")] [XmlArrayItem("__ptd_student_charges", typeof(Student))] public Student[] StudentArray { get; set; } } 

我正在使用此代码反序列化结果:

 private void MainWindow_Loaded(object sender, RoutedEventArgs e) { StudentCollection collection; HttpWebRequest request = WebRequest.Create(stringUrl) as HttpWebRequest; HttpWebResponse response = request.GetResponse() as HttpWebResponse; XmlTextReader reader = new XmlTextReader(response.GetResponseStream()); XmlSerializer serializer = new XmlSerializer(typeof(StudentCollection)); collection = (StudentCollection)serializer.Deserialize(reader); reader.Close(); } 

一旦我运行它,我得到一个带有消息的InvalidOperationException

不期望ArrayOf__ptd_student_charges xmlns =’ http://schemas.datacontract.org/2004/07/something.something ‘>。

我知道xmlns:…不应该在第一个标签中,但不幸的是它是,我不确定如何继续。

基本上,您需要在XML文件中支持默认的XML命名空间 – 您可以通过在StudentCollection上指定它执行此操作:

 [System.Xml.Serialization.XmlRoot("ArrayOf__ptd_student_charges")] [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/something.something", IsNullable = false)] public class StudentCollection { [XmlArray("ArrayOf__ptd_student_charges")] [XmlArrayItem("__ptd_student_charges", typeof(Student))] public Student[] StudentArray { get; set; } } 

和实际的Studentclass:

 [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/something.something", IsNullable = false)] public class Student { .......... } 

或者您可以在反序列化时以编程方式指定它:

 XmlSerializer serializer = new XmlSerializer(typeof(StudentCollection), "http://schemas.datacontract.org/2004/07/something.something"); 

XmlSerializer第二个参数是反序列化XML内容时使用的默认 XML名称空间。

额外的tipp:如果你再次拥有一个XML文件,并且你需要获得代表该XML的C#代码类 – 如果你有Visual Studio 2012或更新版本,只需创建一个新的代码类,将你的XML文件复制到剪贴板中,然后使用Edit > Paste Special > Paste XML as classes ,您将获得所有C#,包括所有XML属性和XML命名空间以及粘贴到Visual Studio中的所有内容