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

¿Fue útil?

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.

http://www.15seconds.com/issue/041117.htm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top