2008-10-02 21 views
5

Jeder XPath wie/NodeName/position() würde Ihnen die Position des Knoten w.r.t es Elternknoten geben.Wie bekomme ich die Position() eines XElement?

Es gibt keine Methode für das XElement-Objekt (Linq to XML), das die Position des Elements ermitteln kann. Ist da?

Antwort

9

Eigentlich NodesBeforeSelf(). Count funktioniert nicht, weil es alles selbst vom Typ bekommt XText

Frage zum XElement-Objekt war. Also dachte ich, es ist

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

, die verwendet werden sollen,

Dank Bryant für die Richtung.

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

Sie könnten die NodesBeforeSelf Methode, dies zu tun:

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()); 
    } 

Update: Wenn Sie wirklich nur eine Position Methode wollen, nur eine Erweiterungsmethode hinzufügen.

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

Jetzt können Sie einfach x.Position() aufrufen. :)

+0

Dank tun konnte, x.NodesBeforeSelf(). Count() einfach funktioniert, groß. Wünschte, sie hätten es Position über der XElement-Klasse genannt. – Vin

+0

Überschreiben Sie meinen vorherigen Kommentar. Überprüfen Sie meine Antwort unten. – Vin

0

Eigentlich in der Load-Methode von XDocument können Sie eine Ladeoption von SetLineInfo festlegen, Sie können dann XElements zu IXMLLineInfo typecast, um die Zeilennummer zu erhalten.

Sie so etwas wie

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

Aber das gibt Ihnen immer noch nicht die Position in Bezug auf das übergeordnete Element eines Knotens. Ist es nicht nur die Zeilennummer? – Vin

Verwandte Themen