【问题标题】:Using LINQ, how do I load a hierarchical XML into a POCO?使用 LINQ,如何将分层 XML 加载到 POCO 中?
【发布时间】:2012-02-08 02:16:37
【问题描述】:

我想使用 LINQ 从分层 XML 数据构建 C# 对象。 我已将 XML 加载为XDocument(首先将 XML 从文件中读取到字符串中)。 我需要一些关于如何解析这个的指导。

从 XML 文件中读取的示例字符串

<?xml version="1.0" encoding="utf-8" ?>
<categories version="1.0">
  <category id="0" name="women" description="test">
    <category id="01" name="tops" description="test"></category>
    <category id="02" name="bottoms" description="test"></category>
    <category id="03" name="accessories" description="test"></category>
  </category>
  <category id="1" name="men" description="test">
    <category id="11" name="shirts" description="test"></category>
    <category id="12" name="trousers" description="test"></category>
    <category id="13" name="accessories" description="test"></category>
  </category>
  <category id="2" name="kids &amp; baby" description="test" />
  <category id="3" name="home &amp; living" description="test" />
</categories>

而我有这样一个 POCO 类:

[DataContract]
public class Category
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public List<Category> SubCategories { get; set; }
}

【问题讨论】:

    标签: c# xml linq poco


    【解决方案1】:

    你有两个选择。

    1. 使用 .NET 序列化,在这种情况下,您需要通过使用适当的属性(属性名称 &rlarr; XML 元素名称)装饰您的 POCO 类来指定 XML 映射。

    2. 使用 LINQ to XML(如您所愿)。在这种情况下,代码可能如下所示:

      var categories = x.Root.Elements().Select(e =>
          new Category
          {
              Id = int.Parse(e.Attribute("id").Value),
              Name = e.Attribute("name").Value,
              Description = e.Attribute("description").Value,
              SubCategories = e.Elements().Select(e1 =>
                  new Category
                  {
                      Id = int.Parse(e1.Attribute("id").Value),
                      Name = e1.Attribute("name").Value,
                      Description = e1.Attribute("description").Value
                  }).ToList()
          }).ToList();
      

      或者递归,通过在你的类中添加一个递归方法Parse

      public static Category Parse(XElement value)
      {
          return new Category
          {
              Id = int.Parse(value.Attribute("id").Value),
              Name = value.Attribute("name").Value,
              Description = value.Attribute("description").Value,
              SubCategories = value.Elements().Select(newvalue =>  Parse(newvalue)).ToList()
          };
      }
      

      并这样称呼它:

      var categories = x.Root.Elements().Select(e => Category.Parse(e)).ToList();
      

    【讨论】:

    • 如果类别超过两个级别,您的代码将无法正常工作。
    • 编辑了我的答案以包含一个递归选项以响应 svick
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多