C#将XML反序列化为对象列表

时间:2017-06-23 22:07:56

标签: c# xml

我有这种XML结构:

 List<ModelXML> model;

        using (TextReader reader = new StringReader(xml_str))
        {
            System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(List<ModelXML>),
                new XmlRootAttribute("rows"));
            model= (List<ModelXML>)deserializer.Deserialize(reader);
        }

我试图将XML反序列化为列表对象,如下所示:

    [XmlElement("Name1")]
    public string Name1{ set; get; }
    [XmlElement("Name2")]
    public string Name2{ set; get; }

我在ModelXML类中的参数:

{{1}}

最后我收到了这个错误:

  

&#39; =&#39;字符,十六进制值0x3D,不能包含在a中   名称。第1行,第13位。

我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

此处如何解决您的问题

首先您必须更改模型

[XmlRoot(ElementName = "column")]
    public class Column
    {
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
        [XmlText]
        public string Text { get; set; }
    }

    [XmlRoot(ElementName = "row")]
    public class Row
    {
        [XmlElement(ElementName = "column")]
        public List<Column> Column { get; set; }
    }

    [XmlRoot(ElementName = "rows")]
    public class Rows
    {
        [XmlElement(ElementName = "row")]
        public List<Row> Row { get; set; }
    }

    [XmlRoot(ElementName = "result")]
    public class Result
    {
        [XmlElement(ElementName = "rows")]
        public Rows Rows { get; set; }
    }

    [XmlRoot(ElementName = "response")]
    public class Response
    {
        [XmlElement(ElementName = "result")]
        public Result Result { get; set; }
        [XmlAttribute(AttributeName = "uri")]
        public string Uri { get; set; }
        [XmlAttribute(AttributeName = "action")]
        public string Action { get; set; }
    }

,然后 使用反序列化代码,如下所示

//here I'm trying to load the file from the disk but you can do the same by passing a string 

  Response  model;

            var xml = File.ReadAllText("file.xml");  
            using (TextReader reader = new StringReader(xml))
            {
                System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(Response));
                model = (Response)deserializer.Deserialize(reader);
            }   

更多您可以像这样访问您的行

var rows = model.Result.Rows; 

//希望这可以提供帮助

答案 1 :(得分:0)

当我运行你的代码时,我得到以下异常。

  

System.InvalidOperationException:'XML文档中存在错误(2,2)。'

的InnerException

  

InvalidOperationException:&lt; response xmlns =''&gt;没想到。

这是因为您必须将最外面的元素定义为根元素,而不是像您尝试的那样将结构中更深的元素定义为根元素。解决这个问题的一种方法是定义像@BRAHIM Kamel这样的所有必要的模型类。

如果您不想拥有这么多模型类,并且您不太关心性能,那么您也可以这样做。

[XmlRoot("row")]
public class ModelXML
{
    public class Column
    {
        [XmlAttribute("name")]
        public string Name { set; get; }
        [XmlText]
        public string Value { set; get; }
    }

    [XmlElement("column")]
    public List<Column> Columns { get; set; }
}

IEnumerable<T> Deserialize<T>(IEnumerable<XElement> elements)
{
    foreach (var element in elements)
    {
        using (var reader = XDocument.Parse(element.ToString()).CreateReader())
        {
            XmlSerializer deserializer = new XmlSerializer(typeof(T));
            yield return (T)deserializer.Deserialize(reader);
        }
    }
}

var document = XDocument.Parse(xml_str);
var collection = Deserialize<ModelXML>(
    document.XPathSelectElements("response/result/rows/row"));