像/節點名/位置任意的XPath()將w.r.t它的父節點給你節點的位置。如何獲取XElement的位置()?
上有沒有的XElement方法(LINQ到XML)對象,該對象可以得到元件的位置。在那兒?
像/節點名/位置任意的XPath()將w.r.t它的父節點給你節點的位置。如何獲取XElement的位置()?
上有沒有的XElement方法(LINQ到XML)對象,該對象可以得到元件的位置。在那兒?
其實NodesBeforeSelf()。計數不工作,因爲它甚至得到的一切類型的XTEXT
問題是關於的XElement對象。 所以我想這是
應使用int position = obj.ElementsBeforeSelf().Count();
,
感謝科比的方向。
static int Position(this XNode node) {
var position = 0;
foreach(var n in node.Parent.Nodes()) {
if(n == node) {
return position;
}
position++;
}
return -1;
}
你可以使用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()。 :)
其實在的XDocument的Load方法,你可以設置SetLineInfo的加載選項,您可以強制轉換XElements到IXMLLineInfo獲得的行號。
你可以做類似
var list = from xe in xmldoc.Descendants("SomeElem")
let info = (IXmlLineInfo)xe
select new
{
LineNum = info.LineNumber,
Element = xe
}
感謝,x.NodesBeforeSelf()。COUNT()簡單的作品,偉大的。 希望他們在XElement課堂上將它稱爲位置。 – Vin 2008-10-02 20:47:54
推翻我以前的評論。在下面檢查我的答案。 – Vin 2008-10-07 15:40:34