如何使用许多子节点反序列化XML [英] How to de-serialize XML with many child nodes

查看:72
本文介绍了如何使用许多子节点反序列化XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我的XML是这样的:

If my XML is like this:

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

我可以将其序列化为此类:

I can serialize it into this class:

[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是这样的呢?

But what if my XML is like this?

<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,则 XmlSerializer 是的方式,而不是 DataContractSerializer 。后者只是缺少 XmlSerializer 提供的细粒度控制;在这种情况下,对于列表/数组布局之类的东西-但是即使 xml属性也是 DataContractSerializer 的问题。就是这样:

If you want control over xml, then XmlSerializer is the way to go, not DataContractSerializer. The latter simply lacks the fine-grained control that XmlSerializer offers; in this case for things like list/array layout - but even just xml attributes are a problem for DataContractSerializer. Then it is just:

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);

这篇关于如何使用许多子节点反序列化XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆