从XML到列表对象的反序列化

我正在执行将XML文件转换为List Objects的程序。 我已成功完成从List到XML的序列化。但我在进行反序列化时遇到问题。 请有人告诉我,我在这段代码中做了什么错。

这是我的XML代码。

    1 vicky1kumar 248847227   2 vicky1kumar2kumar 725228355   3 vicky1kumar2kumar3kumar 2032848116   4 vicky1kumar2kumar3kumar4kumar 853938969   5 vicky1kumar2kumar3kumar4kumar5kumar 530646891   0  

这是我将XML转换为List对象的类

 public class Converter { public static T XmlToObject(string xml) { using (var xmlStream = new StringReader(xml)) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(XmlReader.Create(xmlStream)); } } public static List XmlToObjectList(string xml, string nodePath) { var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xml); var returnItemsList = new List(); foreach (XmlNode xmlNode in xmlDocument.SelectNodes(nodePath)) { returnItemsList.Add(XmlToObject(xmlNode.OuterXml)); } return returnItemsList; } } 

这是我的反序列化代码……

 List decont = new List(); decont = Converter.XmlToObjectList(@"C:\vignesh\serialization\xmlserialize\XmlSerializeContact.xml","//Contact"); foreach (var item in decont) { Console.WriteLine(decont); } 

我收到了这个错误:

根级别的数据无效。 第1行,第1位。

首先,你的xml应如下所示:

     1 vicky1kumar 248847227   2 vicky1kumar2kumar 725228355    

其次,定义serialization classes ,如:

 [XmlRoot(ElementName = "Contact_x0020_Form")] public class Root { [XmlElement("Contacts")] public Contacts contacts{get;set;} } public class Contacts { public List contacts {get;set;} } public class Contact { [XmlElement("Id")] public int Id {get;set;} [XmlElement("Name")] public string Name {get;set;} [XmlElement("Phone")] public string Phone {get;set;} } 

和你的helper classes

 public static class serialize { public static T Deserialize(string path) { T result; using (var stream = File.Open(path, FileMode.Open)) { result = Deserialize(stream); } return result; } public static void Serialize(T root, string path) { using (var stream = File.Open(path, FileMode.Create)) { var xmlSerializer = new XmlSerializer(typeof(T)); xmlSerializer.Serialize(stream, root); } } public static T Deserialize(Stream stream) { var xmlSerializer = new XmlSerializer(typeof(T)); return (T)xmlSerializer.Deserialize(stream); } } 

而且,最后你的function:

 static void Main() { var a = serialize.Deserialize("input.xml"); //xml file name given here. Console.WriteLine(a.contacts); } 

这就是你应该如何进行的。 然后,您可以获取所需的对象列表。

根级别的数据无效。 第1行,第1位。

要解决此第一个错误,您必须了解原因。 问题是LoadXml接受xml字符串; 而您正在将路径传递给Xml文件。 您需要使用Load而不是LoadXml

也就是说,还有很多其他事情你需要纠正。 您问题中提供的序列化 XML似乎不正确 – 例如, Contact节点是其自己的父节点。 因此,您的节点选择将为您提供整个Xml。 (您的意思是将Contacts节点定义为Contact列表的父节点吗?)

  ..  

在反序列化中调用xml数据之前使用它

 xml = Regex.Replace(xml, "<\\?xml.*?>", String.Empty); 

这里xml是你的xml数据。