Может быть, как-то так, если я вас правильно понимаю?(Я не проверял это)
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);
«я хочу только элементы, которые имеют категорию имени» - я не понимаю, что вы имеете в виду здесь?Но если вы хотите выбрать только те элементы, которые имеют атрибут «name», то это должно сработать:
...
var d = from t in e.Elements("category")
where t.Attribute("name") != null
select new Category()
...
Я понимаю, что верхний (часть атрибута «name») не то, что вы хотели, но яОставь это там.Я проверил код по:
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);