2013-03-21 3 views
1

У меня есть этот файл db.xmlКак прочитать файл XML с помощью LINQ

<items> 
<item> 
    <title>Title1</title> 
    <year>2013</title> 
    <categories> 
    <category>Category1</category> 
    <category>Category2</category> 
    <category>Category3</category> 
    </categories> 
    <count>10</count> 
</item> 
(and so on) 
</items> 

Я прочитал так:

var items = from item in xdoc.Descendants("item") 
       select new 
       { 
        Title = item.Element("title").Value, 
        Year = item.Element("year").Value, 
        Categories = item.Element("categories").Value, // I know this is wrong 
        Count = item.Element("count").Value 
      }; 

Проблема заключается в том, как я могу прочитать категории и добавить их в список ?

foreach (var item in items) 
{ 
    book.Title = item.Title; 
    book.Year = item.Year; 
    foreach (var Category in Categories) 
    { 
     book.Categories.Add(Category); 
    } 
    book.Count = item.Count; 
    books.Add(book); 
} 
+0

Вам просто нужно сделать то же самое, как вы делали с первым, только гнездо его внутри, принцип остается тот же –

ответ

4

Вы можете взять список его элементов

EDITED

var items = from item in xdoc.Descendants("item") 
     select new 
     { 
      Title = item.Element("title").Value, 
      Year = item.Element("year").Value, 
      Categories = item.Descendants("categories").Descendants().Select(x=>x.Value).ToList(), 
      Count = item.Element("count").Value 
     }; 
+0

Я думаю, что этот запрос приведет к неправильному результату. Вместо выбора категорий вы возвращаете значение целого родительского элемента –

+0

@lazyberezovsky Почему? Не вернет ли он список категорий потомков? – Alex

+0

нет, он вернет потомок '' element –

5

Лучше использовать литье (в string, чтобы int, и т.д., то чтение значения элемента непосредственно Здесь запрос, который возвращает целые значения для Year и Count свойств Categories являются IEnumerable<string>:..

var items = from item in xdoc.Descendants("item") 
      select new { 
       Title = (string)item.Element("title"), 
       Year = (int)item.Element("year"), 
       Count = (int)item.Element("count"), 
       Categories = from c in item.Element("categories").Elements() 
          select (string)c     
      }; 

Если вы хотите Categories в качестве List<string> затем проанализировать категории по этой категории:

Categories = item.Element("categories") 
        .Elements() 
        .Select(c => (string)c) 
        .ToList() 
+0

@MarcinJuraszek, спасибо, простая опечатка –

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