如何用多个子节点反序列化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,那么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。