¿Cómo obtener la posición () de un XElement?
-
03-07-2019 - |
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?
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
}