Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用多个子节点反序列化XML_C#_Xml_Serialization_Deserialization - Fatal编程技术网

C# 如何使用多个子节点反序列化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>

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