C# 如何使用多个子节点反序列化XML
如果我的XML是这样的:C# 如何使用多个子节点反序列化XML,c#,xml,serialization,deserialization,C#,Xml,Serialization,Deserialization,如果我的XML是这样的: <Item> <Name>Jerry</Name> <Array> <Item> <Name>Joe</Name> </Item> <Item> <Name>Sam</Name> </Item>
<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; }
}
[DataContract(Namespace=”“,Name=“dict”)]
公共类项目
{
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[DataMember(Name=“Array”)]
公共IEnumerable子项{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; }
}
[DataContract(Namespace=”“,Name=“Item”)]
公共类项目
{
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[DataMember(Name=“Item”)]
公共IEnumerable子项{get;set;}
}
装饰类的正确方法是什么?如果您想控制xml,那么
XmlSerializer
才是正确的方法,而不是DataContractSerializer
。后者只是缺少XmlSerializer
提供的细粒度控制;在本例中,对于列表/数组布局之类的内容,但对于DataContractSerializer
,即使是xml属性也是一个问题。那么它只是:
public class Item {
public string Name { get; set; }
[XmlElement("Item")]
public List<Item> Children { get; set; }
}
public class Item {
public string Name { get; set; }
}
试用
在内部,您应该创建一个项目的通用列表,并使用适当的参数将其修饰为CollectionDataContractAttribute 对不起,我没想到这在WP7上会很重要。但事实证明System.Xml.XmlSerializer不是WP7的一部分。建议?我的主要建议是:在问题中提及平台。简单地说,DCS在这方面存在问题。您可能需要转到手动解析。WP7支持LINQ到XML吗?如果是这样的话,我会使用它。不,但是除非您编辑以下问题,否则我不能将我的反对票更改为反对票:)
System.Xml.Serialization.XmlSerializer
是WP7的一部分。您需要添加对System.Xml.Serialization.dll的引用才能使用它。@Jerry请注意Carlosfiguera关于XmlSerializer可用的评论。
var serializer = new XmlSerializer(typeof(Item));
var item = (Item) serializer.Deserialize(source);