如何使用许多子节点反序列化XML

时间:2011-11-21 22:54:42

标签: c# xml serialization deserialization

如果我的XML是这样的:

<Item>
    <Name>Jerry</Name>
    <Array>
        <Item>
            <Name>Joe</Name>
        </Item>
        <Item>
            <Name>Sam</Name>
        </Item>
    </Array>
</Item>

我可以将它序列化为这个类:

[DataContract(Namespace = "", Name = "dict")]
public class Item
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }
    [DataMember(Name = "Array")]
    public IEnumerable<Item> Children { get; set; }
}

但是,如果我的XML是这样的呢?

<Item>
    <Name>Jerry</Name>
    <Item>
        <Name>Joe</Name>
    </Item>
    <Item>
        <Name>Sam</Name>
    </Item>
</Item>

这不起作用:

[DataContract(Namespace = "", Name = "Item")]
public class Item
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }
    [DataMember(Name = "Item")]
    public IEnumerable<Item> Children { get; set; }
}

装修课程的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

如果你想控制xml,那么XmlSerializer就是你要走的路,而不是DataContractSerializer。后者只是缺乏XmlSerializer提供的细粒度控制;在这种情况下,像列表/数组布局 - 但即使只是 xml属性DataContractSerializer的问题。那就是:

public class Item {
    public string Name { get; set; }
    [XmlElement("Item")]
    public List<Item> Children { get; set; }
}
public class Item {
    public string Name { get; set; }
}

var serializer = new XmlSerializer(typeof(Item));
var item = (Item) serializer.Deserialize(source);

答案 1 :(得分:0)

尝试使用CollectionDataContractAttribute 在内部,您应该创建一个通用的Items列表,并使用适当的参数将其装饰为CollectionDataContractAttribute。