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

时间:2013-11-19 04:43:20

标签: c# xml-deserialization

我正在将XML文件转换为List Objects。我已成功完成从List到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>

这是我将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;
    }
}  

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

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);
                    }  

我收到了这个错误:

  

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

3 个答案:

答案 0 :(得分:1)

  

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

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

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

<Contacts>
.. <Contact>

答案 1 :(得分:0)

首先,你的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>

其次,定义serialization classes之类的内容:

[XmlRoot(ElementName = "Contact_x0020_Form")]
public class Root
{
    [XmlElement("Contacts")]
    public Contacts contacts{get;set;}
}


public class Contacts
{
  public List<Contact> 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<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);
    }

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

答案 2 :(得分:-1)

在反序列化

中调用xml数据之前使用它
xml = Regex.Replace(xml, "<\\?xml.*?>", String.Empty);

这里xml是你的xml数据。