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

本文关键字:反序列化 XML 子节点 何用多 | 更新日期: 2023-09-27 18:15:17

如果我的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; }
}

什么是正确的方式来装饰类?

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

如果您想控制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);

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

相关文章: