2010-02-05 7 views
4

Je xml comme ceci:Obtenez la profondeur d'un élément

<A><B>test</B><B><B>test2</B></B><B><B><B>test2</B></B></B></A> 

Comment puis-je obtenir le niveau de chacun de ces éléments à l'aide LINQ to XML

niveau de test = 1 niveau de test2 = 2 niveau de test3 = 3

Je ne sais pas combien de nœuds il y aura ou combien de niveaux il y aura. Je peux écrire ceci comme une fonction récursive mais je pensais que linq à xml pourrait avoir quelque chose de mieux à offrir.

Répondre

5

En supposant que vous avez chargé votre XML comme un objet XDocument ou XElement,

myXElement.AncestorsAndSelf().Count()

devrait vous donner la profondeur d'un élément donné.

+0

Il n'y a pas de méthode Count() renvoyée par AncestorsAndSelf. De plus, la sémantique du code ci-dessus retournera une profondeur d'arbre 1 plus grande que la profondeur 0 réelle. Considérez l'extrait de code ci-dessous, qui corrige ces problèmes. –

+0

public static int GetDepth (cet élément XElement) { int Nombre = 0; foreach (Elément XEl dans element.Ancestors()) Count ++; return Count; } –

+2

Il existe une méthode Count(), il s'agit d'une méthode d'extension LINQ. Si vous ne voulez pas compter l'élément en cours, utilisez Ancestors() au lieu de AncestorsAndSelf(). – Monsignor

0

Lorsque vous avez un élément racine, vous pouvez trouver la profondeur de chaque nœud de texte comme suit:

var depths = 
    root. 
    DescendantNodesAndSelf(). 
    Where(e => e.NodeType == XmlNodeType.Text). 
    Select(n => new { Text = n.ToString(), Depth = n.Parent.Ancestors().Count()});