Linq查询返回xml中的不同值

时间:2014-01-28 09:49:32

标签: c# xml linq linq-to-xml

我有一个具有以下结构的XML:

<Categories>
  <Category>
    <Books>
      <Book>
        <BookId>1</BookId>
        <BookQuantity>150</BookQuantity>
      </Book>
      <Book>
        <BookId>2</BookId>
        <BookQuantity>250</BookQuantity>
      </Book>
    </Books>
  </Category>
  <Category>
    <Books>
      <Book>
        <BookId>1</BookId>
        <BookQuantity>150</BookQuantity>
      </Book>
      <Book>
        <BookId>3</BookId>
        <BookQuantity>250</BookQuantity>
      </Book>
    </Books>
  </Category>
</Categories>

我正在尝试检索每个不同的图书及其在类别中的数量。 输出将是:

Book 1 300
Book 2 250
Book 3 250

执行此操作的最佳方法。我尝试使用linq查询,但无法成功。

1 个答案:

答案 0 :(得分:3)

您可以使用Linq to Xml。查询很简单 - 只需选择所有Book元素并按BookId元素的值对它们进行分组。然后将每个组投影到匿名对象或书类实例中:

var xdoc = XDocument.Load(path_to_xml);

var books = from b in xdoc.Root.Descendants("Book")
            group b by (int)b.Element("BookId") into g
            select new {
                Id = g.Key,
                Quantity = g.Sum(b => (int)b.Element("BookQuantity"))
            };

结果:

[
  { "Id": 1, "Quantity": 300 },
  { "Id": 2, "Quantity": 250 },
  { "Id": 3, "Quantity": 250 }
]

您可以创建Book类的实例:

,而不是创建匿名对象
public class Book
{
   public int Id { get; set; }
   public int Quantity { get; set; }
}