在C#中反序列化XML列表对象

时间:2014-05-20 08:21:48

标签: c# xml serialization

我正在尝试反序列化c#中的xml,看起来像这样(缩短版本):

<?xml version="1.0" encoding="UTF-8"?>
<map>
    <parts>
      <part name="default part">
        <objects count="1597">
            <object type="1" symbol="6">
                <coords count="130">
                    <coord x="-221595" y="-109687" flags="1"/>
                    <coord x="-221625" y="-109744"/>
                    <coord x="-221640" y="-109785"/>
                    <coord x="-221640" y="-109841" flags="1"/>
                    <coord x="-221655" y="-109969"/>
                    <coord x="-221655" y="-110040"/>
                    <coord x="-221640" y="-110164" flags="1"/>
                    <coord x="-221640" y="-110209"/>
                    <coord x="-221655" y="-110265"/>
                </coords>
                <pattern rotation="0">
                    <coord x="0" y="0"/>
                </pattern>
            </object>
          </objects>
        </part>
   </parts>
</map>

使用以下课程:

[XmlRoot("map")] 
public class Map {


    [XmlElement(ElementName = "parts")]
    public List<Part> parts { get; set; }

    public Map()
    {
         parts = new List<Part>();
    }


public class Part {

    [XmlElement(ElementName = "objects")]
    public List<KdToPostGISProject.Object> objects { get; set; }

    public Part()
    {
        objects = new List<KdToPostGISProject.Object>();
    }

    [XmlAttribute(AttributeName = "name")]
    public String name { get; set; }     

}

public class Object
    {
         [XmlElement(ElementName = "coords")]
         public List<Coord> coords { get; set; } 

          public Object()
          {
             coords = new List<Coord>();
          }
    }


public class Coord
{
    [XmlAttribute]
    public int x { get; set; }
    [XmlAttribute]
    public int y { get; set; }
}

主要功能:

var serializer = new XmlSerializer(typeof(Map), new XmlRootAttribute("map"));               

Map resultingMessage = (Map)serializer.Deserialize(new FileStream(@"myXml.xml", FileMode.Open));

出于某种原因,我一直试图弄清楚我在我的部分类中不断获得零对象(和空名称)。现在我被困了,任何有任何投入的人?

1 个答案:

答案 0 :(得分:5)

对于List<T>成员,您必须将其标记为例如:

[XmlArray(ElementName = "parts")]
[XmlArrayItem(ElementName = "part")]
public List<Part> parts { get; set; }

[XmlElement(ElementName = "parts")]

更改所有List<T>成员,然后它应该可以正常工作。