C # linq-to-xml, Obtener una lista con los nodos?
-
29-09-2019 - |
Pregunta
Este es el xml prueba que estoy utilizando:
<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>
Ahora quiero obligar a una vista de árbol que ASPX, quiero sólo los elementos que tienen la categoría de nombre y quiero que el nombre de las personas que aparecen en la vista de árbol.
Su fácil de obtener el ID y nombres:
var d = from t in data.Descendants("category")
select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };
Pero, ¿cómo mantener la estructura en el árbol?
Esto debería tener este aspecto:
Test1
-> Prueba2
Test3
Solución
Tal vez algo como esto si he entendido bien? (No he probado)
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;
}
Llamada con:
var structure = CategoryTreeStructure(doc.Root);
"Quiero sólo los elementos que tienen la categoría de nombre" - No entiendo lo que quiere decir aquí? Pero si sólo desea seleccionar aquellos elementos que tienen un atributo "name", entonces esto debería funcionar:
...
var d = from t in e.Elements("category")
where t.Attribute("name") != null
select new Category()
...
Yo entiendo que la (el "nombre" parte atributo) superior no es lo que quería, pero lo dejo ahí. He probado el código contra:
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);
Otros consejos
En realidad, he encontrado este enlace, que hace exactamente lo que está pidiendo :) Y es sin LINQ, así que pensé que merecía otra respuesta.