C # LINQ-TO-XML, получение списка с узлами?
-
29-09-2019 - |
Вопрос
Это тестовый 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>
Теперь я хочу связать это для TreeView aspx, я хочу только элементы, которые имеют категорию имени, и я хочу, чтобы имя их появились в TreeView.
Легко получить удостоверение личности и имена:
var d = from t in data.Descendants("category")
select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };
Но как я могу сохранить структуру в TreeView?
Это должно выглядеть так:
Test1.
-> test2.
Test3.
Решение
Может быть, что-то вроде этого, если я вас правильно понимаю? (Я не проверял это)
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);
Другие советы
На самом деле, я нашел эту ссылку, которая имеет именно то, что вы просите :), и это без Linq, поэтому я думал, что это заслуживает другого ответа.