C# 从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文件到列表对象的程序。我已经成功地完成了从列表到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">
  <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);
    }