2014-01-28 6 views
0

У меня есть XML со следующей структурой:Linq запрос возвращать различные значения в 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

Добро пожаловать на ТАК. Пожалуйста, позаботьтесь о форматировании. И предоставить то, что вы пробовали до сих пор с конкретными ошибками/проблемами. Существует много учебников по LINQ to XML, поэтому маловероятно, что реальные усилия были выполнены ... –

+0

Пожалуйста, добавьте к вопросу, который вы пробовали. Это сделает ваш вопрос полным, и мы скажем вам, что именно пошло не так. –

ответ

3

Вы можете использовать Linq to Xml. Запрос прост - просто выберите все элементы книги и сгруппируйте их по значению элемента 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 } 
] 

Вместо того чтобы создавать анонимные объекты, которые вы можете создавать экземпляры книги класса:

public class Book 
{ 
    public int Id { get; set; } 
    public int Quantity { get; set; } 
} 
+2

Почему вы отвечаете на вопрос без каких-либо усилий? Это будет портал для написания кода других людей? Кто-то с вашей репутацией должен заботиться о качестве SO ... Если бы я задал вопрос «Я бы хотел добавить два номера, как это сделать?» вы бы ответили, чтобы получить легкую репутацию ?! –

+0

Согласен с вами, я обычно прохожу такие вопросы или отмечаю их * вне темы, потому что демонстрирует минимальное понимание проблемы, которая решается *. –

Смежные вопросы