a1204773
a1204773

Reputation: 7053

How to read xml file using linq

I have this db.xml file

<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>

I read like that:

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
           };

The problem is how I can read the categories and add them to list?

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);
}

Upvotes: 1

Views: 9721

Answers (2)

Alex
Alex

Reputation: 8937

You can take the list of its elements

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
       };

Upvotes: 4

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236328

It's better to use casting (to string, to int, etc then reading element's value directly. Here is query which returns integer values for Year and Count properties. Categories are 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                   
            };

If you want Categories as List<string> then parse categories this way:

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

Upvotes: 5

Related Questions