c# - 如何反序列化具有许多子节点的 XML

标签 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; }
}

怎样装饰类(class)才是正确的?

最佳答案

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

关于c# - 如何反序列化具有许多子节点的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219700/

相关文章:

c# - 如何将 appsetting.json 部分加载到 .NET Core 中的字典中?

Java DOM 通过 ID 获取元素

c# - 使用 WCF 和 Data Contract Serializer 时需要生成 XmlSerializers 程序集

PHP XML 在另一个元素之后(或之前)插入元素

xml - WSO2 使用 xpath 获取 xml-content 属性中的元素

java - 序列化对象会包含元数据吗?

.net - 跨不同框架版本的.NET序列化的稳定性

c# - 如何将二维字符串数组转换为二维 [int, double, bool, ..] 数组?

c# - ResXResourceWriter 砍掉文件末尾

c# - 在 WPF 工具箱中找不到我的 winforms 控件