C # LINQ to XML, ottenere una lista con i nodi?
-
29-09-2019 - |
Domanda
Questo è il xml test che sto usando:
<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>
Ora voglio che si legano a un TreeView ASPX, voglio solo gli elementi che hanno il nome categoria e voglio il nome di coloro che appaia nella vista ad albero.
La sua facile da ottenere l'id e nomi:
var d = from t in data.Descendants("category")
select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };
, ma come faccio a mantenere la struttura nel controllo TreeView?
Questo dovrebbe essere simile a questo:
Test1
-> Test2
Test3
Soluzione
Forse qualcosa di simile se ho capito bene? (Non ho provato)
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;
}
Chiama con:
var structure = CategoryTreeStructure(doc.Root);
"Voglio solo gli elementi che hanno il nome di categoria" - Non capisco cosa vuoi dire qui? Ma se si desidera solo per selezionare gli elementi che hanno un attributo "nome", allora questo dovrebbe funzionare:
...
var d = from t in e.Elements("category")
where t.Attribute("name") != null
select new Category()
...
Capisco che il superiore (il "nome" di attributo parte) non è quello che si voleva, ma io non vi lascio. Ho testato il codice contro:
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);
Altri suggerimenti
In realtà, ho trovato questo link che fa esattamente quello che stai chiedendo :) ed è senza LINQ, così ho pensato che meritava un'altra risposta.