C# 从XML到列表对象的反序列化
我正在做转换XML文件到列表对象的程序。我已经成功地完成了从列表到XML的序列化,但在进行反序列化时遇到了问题。请任何人告诉我我在这个代码中做了什么错误 这是我的XML代码C# 从XML到列表对象的反序列化,c#,xml-deserialization,C#,Xml Deserialization,我正在做转换XML文件到列表对象的程序。我已经成功地完成了从列表到XML的序列化,但在进行反序列化时遇到了问题。请任何人告诉我我在这个代码中做了什么错误 这是我的XML代码 <?xml version="1.0"?> <Contact_x0020_Form xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Con
<?xml version="1.0"?>
<Contact_x0020_Form xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Contact>
<Contact>
<Id>1</Id>
<Name>vicky1kumar</Name>
<Phone>248847227</Phone>
</Contact>
<Contact>
<Id>2</Id>
<Name>vicky1kumar2kumar</Name>
<Phone>725228355</Phone>
</Contact>
<Contact>
<Id>3</Id>
<Name>vicky1kumar2kumar3kumar</Name>
<Phone>2032848116</Phone>
</Contact>
<Contact>
<Id>4</Id>
<Name>vicky1kumar2kumar3kumar4kumar</Name>
<Phone>853938969</Phone>
</Contact>
<Contact>
<Id>5</Id>
<Name>vicky1kumar2kumar3kumar4kumar5kumar</Name>
<Phone>530646891</Phone>
</Contact>
</Contact>
<Id>0</Id>
</Contact_x0020_Form>
1.
维克库马尔
248847227
2.
vicky1kumar2kumar
725228355
3.
vicky1kumar2kumar3kumar
2032848116
4.
Vicky1Kumar2Kmar3Kumar4Kmar
853938969
5.
vicky1kumar2kumar3kumar4kumar5kumar
530646891
0
这是我用于将XML转换为列表对象的类
public class Converter
{
public static T XmlToObject<T>(string xml)
{
using (var xmlStream = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(XmlReader.Create(xmlStream));
}
}
public static List<T> XmlToObjectList<T>(string xml, string nodePath)
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
var returnItemsList = new List<T>();
foreach (XmlNode xmlNode in xmlDocument.SelectNodes(nodePath))
{
returnItemsList.Add(XmlToObject<T>(xmlNode.OuterXml));
}
return returnItemsList;
}
}
公共类转换器
{
公共静态T XmlToObject(字符串xml)
{
使用(var xmlStream=newstringreader(xml))
{
var serializer=newxmlserializer(typeof(T));
return(T)serializer.Deserialize(XmlReader.Create(xmlStream));
}
}
公共静态列表XmlToObjectList(字符串xml,字符串nodePath)
{
var xmlDocument=新的xmlDocument();
LoadXml(xml);
var returnItemsList=新列表();
foreach(xmlDocument.SelectNodes中的XmlNode(nodePath))
{
returnItemsList.Add(XmlToObject(xmlNode.OuterXml));
}
返回项目列表;
}
}
这是我的反序列化代码
List<string> decont = new List<string>();
decont = Converter.XmlToObjectList<string>(@"C:\vignesh\serialization\xmlserialize\XmlSerializeContact.xml","//Contact");
foreach (var item in decont)
{
Console.WriteLine(decont);
}
List decont=new List();
decont=Converter.XmlToObjectList(@“C:\vignesh\serialization\xmlserialize\xmlserialize\XmlSerializeContact.xml”,“//Contact”);
foreach(decont中的var项目)
{
控制台写入线(decont);
}
我得到了这个错误:
根级别的数据无效。第1行,位置1
在反序列化中调用xml数据之前使用此选项
xml = Regex.Replace(xml, "<\\?xml.*?>", String.Empty);
xml=Regex.Replace(xml,”,String.Empty);
这里xml是您的xml数据
根级别的数据无效。第1行,位置1
要解决第一个错误,您必须了解原因。问题是接受xml字符串;而您正在传递Xml文件的路径。您需要使用而不是LoadXml
也就是说,还有很多其他事情需要纠正。您的问题中提供的序列化XML似乎不正确—例如,Contact
节点是它自己的父节点。因此,节点选择为您提供了整个Xml。(您是否打算将联系人
节点定义为联系人
列表的父节点?)
..
首先,您的xml应该如下所示:
<?xml version="1.0"?>
<Contact_x0020_Form>
<Contacts>
<Contact>
<Id>1</Id>
<Name>vicky1kumar</Name>
<Phone>248847227</Phone>
</Contact>
<Contact>
<Id>2</Id>
<Name>vicky1kumar2kumar</Name>
<Phone>725228355</Phone>
</Contact>
</Contacts>
</Contact_x0020_Form>
以及您的助手类
public static class serialize
{
public static T Deserialize<T>(string path)
{
T result;
using (var stream = File.Open(path, FileMode.Open))
{
result = Deserialize<T>(stream);
}
return result;
}
public static void Serialize<T>(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<T>(Stream stream)
{
var xmlSerializer = new XmlSerializer(typeof(T));
return (T)xmlSerializer.Deserialize(stream);
}
}
公共静态类序列化
{
公共静态T反序列化(字符串路径)
{
T结果;
使用(var stream=File.Open(路径,FileMode.Open))
{
结果=反序列化(流);
}
返回结果;
}
公共静态void序列化(T根,字符串路径)
{
使用(var stream=File.Open(path,FileMode.Create))
{
var xmlSerializer=新的xmlSerializer(typeof(T));
序列化(流,根);
}
}
公共静态T反序列化(流)
{
var xmlSerializer=新的xmlSerializer(typeof(T));
返回(T)xmlSerializer.Deserialize(流);
}
}
最后,你的职责是:
static void Main()
{
var a = serialize.Deserialize<Root>("input.xml"); //xml file name given here.
Console.WriteLine(a.contacts);
}
static void Main()
{
var a=serialize.Deserialize(“input.xml”);//此处给出的xml文件名。
控制台写入线(a.触点);
}
你应该这样做。然后,您可以获得所需对象的列表。Ya您是对的。。。我把它作为LoadXml而不是Load。这是我的错误。但我还是在这一行上得到了错误。。return(T)serializer.Deserialize(XmlReader.Create(xmlStream));错误是:XML文档(1,2)中有一个错误。这样做的目的是什么?你想达到什么目的?Dharani@看到我的答案了吗
public static class serialize
{
public static T Deserialize<T>(string path)
{
T result;
using (var stream = File.Open(path, FileMode.Open))
{
result = Deserialize<T>(stream);
}
return result;
}
public static void Serialize<T>(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<T>(Stream stream)
{
var xmlSerializer = new XmlSerializer(typeof(T));
return (T)xmlSerializer.Deserialize(stream);
}
}
static void Main()
{
var a = serialize.Deserialize<Root>("input.xml"); //xml file name given here.
Console.WriteLine(a.contacts);
}