2008-10-02 62 views
5

像/節點名/位置任意的XPath()將w.r.t它的父節點給你節點的位置。如何獲取XElement的位置()?

上有沒有的XElement方法(LINQ到XML)對象,該對象可以得到元件的位置。在那兒?

回答

9

其實NodesBeforeSelf()。計數不工作,因爲它甚至得到的一切類型的XTEXT

問題是關於的XElement對象。 所以我想這是

應使用
int position = obj.ElementsBeforeSelf().Count(); 

感謝科比的方向。

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

你可以使用NodesBeforeSelf方法來做到這一點:

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

更新:如果你真的只想要一個位置的方法,只需添加一個擴展方法。

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

現在你可以調用x.Position()。 :)

+0

感謝,x.NodesBeforeSelf()。COUNT()簡單的作品,偉大的。 希望他們在XElement課堂上將它稱爲位置。 – Vin 2008-10-02 20:47:54

+0

推翻我以前的評論。在下面檢查我的答案。 – Vin 2008-10-07 15:40:34

0

其實在的XDocument的Load方法,你可以設置SetLineInfo的加載選項,您可以強制轉換XElements到IXMLLineInfo獲得的行號。

你可以做類似

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