EDIT: Ahora que tenemos un poco más contexto, parece que realmente has conseguido XML para empezar. Sin embargo, todavía no sabemos qué procesamiento está realizando en los elementos. XSLT puede ser el enfoque correcto, pero otra sería utilizar LINQ para XML y su método Descendants
:
var doc = XDocument.Load(stream);
var descendants = doc.Descendants("Folder");
// Use descendants now
Eso puede llegar a ser aún más simple que el enfoque XSLT. Por ejemplo, si usted quiere transformarlo en un List<string>
mediante la adopción de un atributo de cada elemento:
var doc = XDocument.Load(stream);
var names = doc.Descendants("Folder")
.Select(x => (strong) x.Attribute("name"))
.ToList();
Una desventaja es que esto todavía va a cargar todo el archivo XML en la memoria como XElement
objetos (etc). Es muy posible que la versión XSLT pueda manejar esto de forma continua con un uso de memoria más eficiente. Dimitre sin duda puede dar más información si esto es relevante.
No hay nada en LINQ para aplanar múltiples niveles de jerarquía sin realizar recursividad mismo. SelectMany
realiza uno nivel de aplanamiento, pero debe recurse para aplanar su jerarquía de niveles múltiples a una sola lista.
Ahora bien, si usted está utilizando LINQ to XML, que hace apoyo que sea muy fácil - sólo puede utilizar el método de Descendants
:
var allFolders = root.Descendants("Folder");
escribir algo similar para su dominio de clase, sin embargo, que' Necesito escribir más código. Si puede proporcionar más información acerca de lo que realmente obtuvo (clases XML o de dominio), podemos ayudarle más.
EDITAR: Bueno, parece que XML es una amenaza. Pero encontrar a todos los descendientes es bastante fácil.Usted puede hacerlo usando bloques iteradores, pero eso se vuelve bastante desagradablemente ineficiente con bastante rapidez. Aquí hay otra alternativa simple:
public IList<Folder> SelfAndDescendants()
{
List<Folder> ret = new List<Folder>();
AddSelfAndDescendants(ret);
return ret;
}
private void AddSelfAndDescendants(IList<Folder> list)
{
list.Add(this);
foreach (var child in children)
{
AddSelfAndDescendants(list);
}
}
que pueda adaptar el algoritmo exacto basado en el orden en el que desea que los niños regresen.
¿Qué quieres decir con 'lista plana'? –
lista plana significa que la lista principal del ejemplo anterior solo tiene {A, B} y quiero que se convierta en {A, A.1, A.1.1, A.1.2, A.2, A.2.1, ... ., B.2.2, B.2.2.1, B.2.2.2} –