使用c#中的列表反序列化XML到对象

时间:2014-09-21 13:54:09

标签: c# xml serialization xml-deserialization

我想在C#中反序列化XML到对象,对象有一个字符串属性和其他对象列表。 有些类描述了XML对象,我的代码不起作用(它在下面,XML在我的帖子的末尾)。我的反序列化代码不会返回任何对象。

我认为我对属性做错了,你能检查它并给我一些建议来解决它。 谢谢你的帮助。

[XmlRoot("shepherd")]
public class Shepherd
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlArray(ElementName = "sheeps", IsNullable = true)]
    [XmlArrayItem(ElementName = "sheep")]
    public List<Sheep> Sheeps { get; set; }
}

public class Sheep
{
    [XmlElement("colour")]
    public string colour { get; set; }
}

有用于将XML反序列化为对象的C#代码

        var rootNode = new XmlRootAttribute();
        rootNode.ElementName = "createShepherdRequest";
        rootNode.Namespace = "http://www.sheeps.pl/webapi/1_0";
        rootNode.IsNullable = true;

        Type deserializeType = typeof(Shepherd[]);
        var serializer = new XmlSerializer(deserializeType, rootNode);

        using (Stream xmlStream = new MemoryStream())
        {
            doc.Save(xmlStream);

            var result = serializer.Deserialize(xmlStream);
            return result as Shepherd[];
        }

我想要反序列化

的XML示例
<?xml version="1.0" encoding="utf-8"?>
<createShepherdRequest xmlns="http://www.sheeps.pl/webapi/1_0">
  <shepherd>
    <name>name1</name>
    <sheeps>
      <sheep>
        <colour>colour1</colour>
      </sheep>
      <sheep>
        <colour>colour2</colour>
      </sheep>
      <sheep>
        <colour>colour3</colour>
      </sheep>
    </sheeps>
  </shepherd>
</createShepherdRequest>

1 个答案:

答案 0 :(得分:1)

XmlRootAttribute在用作项目时不会更改标记的名称。序列化程序需要<Shepherd>,但会找到<shepherd>。 (XmlAttributeOverrides似乎也不适用于数组。)修复它的一种方法是改变类名本身的情况:

public class shepherd
{
    // ...
}

使用属性更容易的替代方法是创建一个合适的包装类:

[XmlRoot("createShepherdRequest", Namespace = "http://www.sheeps.pl/webapi/1_0")]
public class CreateShepherdRequest
{
    [XmlElement("shepherd")]
    public Shepherd Shepherd { get; set; }
}