Pregunta

Cualquier XPath como / NodeName / position () le dará la posición del Nodo w.r.t es el nodo principal.

No hay ningún método en el objeto XElement (Linq to XML) que pueda obtener la posición del Elemento. Hay?

¿Fue útil?

Solución

En realidad, NodesBeforeSelf (). El recuento no funciona porque lo tiene todo, incluso de tipo XText

La pregunta era sobre el objeto XElement. Así que pensé que es

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

que se debe utilizar,

Gracias a Bryant por la dirección.

Otros consejos

Puedes 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 solo quieres un método de Posición, simplemente agrega un método de extensión.

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

Ahora puedes llamar x.Position (). :)

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

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

podrías hacer algo como

var list = from xe in xmldoc.Descendants("SomeElem")
           let info = (IXmlLineInfo)xe
           select new 
           {
              LineNum = info.LineNumber,
              Element = xe
           }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top