/NodeName/position() のような XPath は、親ノードであるノードの位置を示します。
Element の位置を取得できる XElement (Linq to XML) オブジェクトのメソッドはありません。ある?
/NodeName/position() のような XPath は、親ノードであるノードの位置を示します。
Element の位置を取得できる XElement (Linq to XML) オブジェクトのメソッドはありません。ある?
実際には NodesBeforeSelf().Count は、XText 型であってもすべてを取得するため機能しません。
質問は XElement オブジェクトに関するものでした。だから私はそれだと思った
int position = obj.ElementsBeforeSelf().Count();
使うべきもの、
指示してくれたブライアントに感謝します。
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());
}
更新: 本当に Position メソッドだけが必要な場合は、拡張メソッドを追加するだけです。
public static class ExMethods
{
public static int Position(this XNode node)
{
return node.NodesBeforeSelf().Count();
}
}
これで 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;
}
実際には、XDocument の Load メソッドで SetLineInfo のロード オプションを設定できます。次に、XElements を IXMLLineInfo に型キャストして、行番号を取得できます。
あなたは次のようなことができます
var list = from xe in xmldoc.Descendants("SomeElem")
let info = (IXmlLineInfo)xe
select new
{
LineNum = info.LineNumber,
Element = xe
}