【问题标题】:How to de-serialize XML with many child nodes如何反序列化具有许多子节点的 XML
【发布时间】:2023-03-14 10:11:01
【问题描述】:

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

装饰班级的正确方法是什么?

【问题讨论】:

    标签: c# xml serialization deserialization


    【解决方案1】:

    如果你想控制 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 的一部分。建议?
    • 我的主要建议是:在问题中提及平台。 DCS 在这方面有问题,很简单。您可能不得不手动解析。 WP7 是否支持 LINQ-to-XML?如果是这样,我会使用它。
    • 不,但是除非您编辑问题,否则我无法将我的反对票更改为赞成票:)
    • System.Xml.Serialization.XmlSerializer 是 WP7 的一部分。您需要添加对 System.Xml.Serialization.dll 的引用才能使用它。
    • @Jerry 请注意 carlosfigueira 关于 XmlSerializer 可用的评论。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      相关资源
      最近更新 更多