使用List<>将Xml字符串反序列化为对象

时间:2014-10-13 11:56:24

标签: c# .net xml deserialization

我试图将xml字符串反序列化为自定义类,但我可以获得我的" Riesgo"字段充满了asegurado类:

<xml xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
    <CodPostal>28029</CodPostal>
    <Canal>216 </Canal>
    <FormaPago>M</FormaPago>
    <ConSeguro>N</ConSeguro>
    <FechaEfecto>01/01/2014</FechaEfecto>
    <Riesgo>
        <asegurado>
            <sexo>H</sexo>
            <edad>37</edad>
            <parentesco>M</parentesco>
        </asegurado>
        <asegurado>
            <sexo>M</sexo>
            <edad>34</edad>
            <parentesco>C</parentesco>
        </asegurado>
        <asegurado>
            <sexo>H</sexo>
            <edad>4</edad>
            <parentesco>D</parentesco>
        </asegurado>
    </Riesgo>
</xml>

我尝试了几件事,但Riesgo里面的List总是无效。

 public class TarificadorObject
    {

        [DataContract]
        [Serializable]
        [XmlRoot("xml")]
        public class TarificadorIn
        {
            [XmlElement("CodPostal")]
            public Int32 CodPostal { get; set; }
            [XmlElement("Canal")]
            public Int32 Canal { get; set; }

            [XmlElement("Riesgo")]
            [XmlArrayItem("asegurado", Type = typeof (Asegurado))]
            public List<Asegurado> asegurado
            {
                get { return _asegurados;  }
                set { _asegurados = value; }
            }

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

            private List<Asegurado> _asegurados = new List<Asegurado>();
        }



        [Serializable]
        public class Asegurado
        {
            [XmlAttribute("sexo")]
            public string sexo { get; set; }
            [XmlAttribute("edad")]
            public Int32 edad { get; set; }
            [XmlAttribute("parentesco")]
            public string parentesco { get; set; }
        }
    }

1 个答案:

答案 0 :(得分:3)

你想:

[XmlArray("Riesgo")]
[XmlArrayItem("asegurado", Type = typeof (Asegurado))]

不是XmlElementAttribute(这导致列表内容直接放在 的父母下面。)

实际上,如果你愿意,你可以更节俭;隐含Type(来自列表),如果需要,可以省略。

另请注意,这些都是错误的:

[XmlAttribute("sexo")]
public string sexo { get; set; }
[XmlAttribute("edad")]
public Int32 edad { get; set; }
[XmlAttribute("parentesco")]
public string parentesco { get; set; }

它们不是xml属性 - 它们是元素;你可以用以下代码替换它:

public string sexo { get; set; }
public int edad { get; set; }
public string parentesco { get; set; }

(默认行为是为属性命名的元素)