2008-10-02 9 views

Respuesta

9

En realidad NodesBeforeSelf(). Count no funciona porque se pone todo, incluso de tipo xtext

pregunta era sobre el objeto XElement. por lo que pensé que es

int position = obj.ElementsBeforeSelf().Count(); 

que se debe utilizar,

Gracias a Bryant para la dirección.

0
static int Position(this XNode node) { 
    var position = 0; 
    foreach(var n in node.Parent.Nodes()) { 
    if(n == node) { 
     return position; 
    } 
    position++; 
    } 
    return -1; 
} 
5

Se puede usar el método NodesBeforeSelf para hacer esto:

XElement root = new XElement("root", 
     new XElement("one", 
      new XElement("oneA"), 
      new XElement("oneB") 
     ), 
     new XElement("two"), 
     new XElement("three") 
    ); 

    foreach (XElement x in root.Elements()) 
    { 
     Console.WriteLine(x.Name); 
     Console.WriteLine(x.NodesBeforeSelf().Count()); 
    } 

Actualización: Si realmente quiere un método de posición, sólo tiene que añadir un método de extensión.

public static class ExMethods 
{ 
    public static int Position(this XNode node) 
    { 
     return node.NodesBeforeSelf().Count(); 
    } 
} 

Ahora puede simplemente llamar a x.Position(). :)

+0

Gracias, x.NodesBeforeSelf(). Count() simplemente funciona, muy bien. Ojalá lo hubieran llamado Posición en la parte superior de la clase XElement. – Vin

+0

Anular mi comentario anterior. Verifique mi respuesta a continuación. – Vin

0

En realidad, en el método Cargar de XDocument puede establecer una opción de carga de SetLineInfo, luego puede encasillar XElements en IXMLLineInfo para obtener el número de línea.

que podría hacer algo como

var list = from xe in xmldoc.Descendants("SomeElem") 
      let info = (IXmlLineInfo)xe 
      select new 
      { 
       LineNum = info.LineNumber, 
       Element = xe 
      } 
+0

Pero eso aún no le da la posición con respecto al padre de un nodo. ¿No es solo el número de línea? – Vin

Cuestiones relacionadas