С# linq-to-xml, получение списка с узлами?

Это тестовый xml, который я использую:

<categories>
<category id="1" name="Test1">
    <category id="2" name="Test2">
        <misc id="1"></misc>
    </category>
</category>    
<category id="3" name="Test3">
    <misc id="2"></misc>
</category>    

Now i want to bind that to an ASPX treeview, i want only the elements that have the name category and i want the name of those to appear in the treeview.

Легко получить идентификатор и имена:

var d = from t in data.Descendants("category") 
   select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };

но как мне сохранить структуру в дереве?

Это должно выглядеть так:

Тест1

-> Тест2

Тест3


person Patrick    schedule 24.06.2010    source источник


Ответы (2)


Может что-то подобное, если я правильно вас понял? (я не проверял)

class Category
{
    public string ID { get; set; }
    public string Name { get; set; }
    public IEnumerable<Category> SubCategories { get; set; }
}

IEnumerable<Category> CategoryTreeStructure(XElement e)
{
   var d = from t in e.Elements("category")
           select new Category()
           { 
               ID = t.Attribute("id").Value, 
               Name = t.Attribute("name").Value,
               SubCategories = CategoryTreeStructure(t)
           };

   return d;
}

Назовите это с помощью:

var structure = CategoryTreeStructure(doc.Root);

"мне нужны только элементы, у которых есть категория имени" - я не понимаю, что вы здесь имеете в виду? Но если вы хотите выбрать только те элементы, у которых есть атрибут «имя», это должно работать:

   ...
   var d = from t in e.Elements("category")
           where t.Attribute("name") != null
           select new Category()
           ...

Я понимаю, что верхняя часть (часть атрибута «имя») — это не то, что вы хотели, но я оставляю ее там. Я проверил код на:

XDocument doc = XDocument.Parse(@"<categories>
<category id=""1"" name=""Test1"">
    <category id=""2"" name=""Test2"">
        <misc id=""1""></misc>
    </category>
</category>    
<category id=""3"" name=""Test3"">
    <misc id=""2""></misc>
</category>  
</categories>");
            var structure = CategoryTreeStructure(doc.Root);
person Lasse Espeholt    schedule 24.06.2010
comment
Извини, я виноват. Мне нужны только элементы, которые называются категориями, например: ‹category ....› - person Patrick; 25.06.2010
comment
Ах, хорошо, тогда верхний код должен быть в порядке :) Я проверил его сейчас, и он работает. Я опубликовал несколько незначительных изменений в коде. - person Lasse Espeholt; 25.06.2010

На самом деле, я нашел эту ссылку, которая делает именно то, о чем вы просите :) И она без LINQ, поэтому я подумал, что она заслуживает другого ответа.

http://www.15seconds.com/issue/041117.htm

person Lasse Espeholt    schedule 24.06.2010