【问题标题】:Deserialization from XML to List Object从 XML 反序列化到列表对象
【发布时间】:2013-11-19 04:43:20
【问题描述】:

我正在执行将 XML 文件转换为列表对象的程序。我已经成功地完成了从 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。

【问题讨论】:

  • Dharani @看我的回答

标签: c# xml-deserialization


【解决方案1】:

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

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

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

<Contacts>
.. <Contact>

【讨论】:

  • 是的,你是对的......我把它作为 LoadXml 而不是 Load..这是我的错误。但我再次在这条线上得到了错误.. return (T)serializer.Deserialize(XmlReader.创建(xmlStream));错误是:XML 文档 (1, 2) 中存在错误。
【解决方案2】:

首先,您的 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);
    }

这就是你应该继续的方式。然后,你可以得到你想要的对象列表。

【讨论】:

    【解决方案3】:

    在反序列化调用xml数据之前使用这个

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

    这里的 xml 是你的 xml 数据。

    【讨论】:

    • 这样做有什么意义?你想达到什么目的?
    猜你喜欢
    • 2013-09-24
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多