C # LINQ-to-xml, obtenir une liste avec des noeuds?
-
29-09-2019 - |
Question
Ceci est le xml de test que j'utilise:
<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>
Maintenant, je veux lier cela à une vue arborescente ASPX, je veux que les éléments qui ont la catégorie nom et je veux le nom de ceux à apparaître dans l'arborescence.
Il est facile d'obtenir l'identifiant et les noms:
var d = from t in data.Descendants("category")
select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };
mais comment puis-je garder la structure dans l'arbre?
Cela devrait ressembler à ceci:
Test1
-> Test2
Test3
La solution
Peut-être quelque chose comme ça si je vous comprends bien? (Je ne l'ai pas testé)
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;
}
Appelez avec:
var structure = CategoryTreeStructure(doc.Root);
« Je veux que les éléments qui ont la catégorie du nom » - Je ne comprends pas ce que vous entendez ici? Mais si vous voulez seulement sélectionner les éléments qui ont un attribut « nom », alors cela devrait fonctionner:
...
var d = from t in e.Elements("category")
where t.Attribute("name") != null
select new Category()
...
Je comprends que la partie supérieure (la partie de l'attribut « name ») n'est pas ce que tu voulais, mais je laisse là. J'ai testé le code contre:
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);
Autres conseils
En fait, je l'ai trouvé ce lien qui fait exactement ce que vous demandez :) Et il est sans LINQ, donc je pensais qu'il méritait une autre réponse.