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

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

如何正确地装饰类?

2个回答

5
如果您希望控制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);

抱歉,我没有想到这与WP7有关。但是事实证明,System.Xml.XmlSerializer不是WP7的一部分。有什么建议吗? - Jerry Nixon
我的主要建议是:在问题中提到平台。DCS在这里有问题。你可能需要降低到手动解析。WP7支持LINQ-to-XML吗?如果支持,我会使用它。 - Marc Gravell
不可以,除非你编辑了这个问题,否则我无法将我的踩变成赞 :) - Kyle W
2
System.Xml.Serialization.XmlSerializer是WP7的一部分。您需要添加对System.Xml.Serialization.dll的引用才能使用它。 - carlosfigueira
@Jerry请注意carlosfigueira的评论,XmlSerializer是可用的。 - Marc Gravell

0

尝试使用CollectionDataContractAttribute。在内部,您应该创建一个项目的通用列表,并使用适当的参数将其装饰为CollectionDataContractAttribute。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接