8

/NodeName/position() のような XPath は、親ノードであるノードの位置を示します。

Element の位置を取得できる XElement (Linq to XML) オブジェクトのメソッドはありません。ある?

4

4 に答える 4

11

実際には NodesBeforeSelf().Count は、XText 型であってもすべてを取得するため機能しません。

質問は XElement オブジェクトに関するものでした。だから私はそれだと思った

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

使うべきもの、

指示してくれたブライアントに感謝します。

于 2008-10-02T23:19:52.920 に答える
6

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() を呼び出すことができます。:)

于 2008-10-02T20:36:16.213 に答える
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;
}
于 2008-10-02T20:33:25.707 に答える
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
           }
于 2008-10-02T23:36:39.947 に答える