2008-10-02 2 views
5

Любой XPath, такой как/NodeName/position(), предоставит вам позицию узла w.r.t, который является родительским узлом.Как получить позицию() XElement?

На объекте XElement (Linq to XML) отсутствует метод, который может получить позицию элемента. Здесь?

ответ

9

На самом деле NodesBeforeSelf(). Count не работает, потому что он получает все, даже типа XText

Вопрос был об объекте XElement. Так я понял, что это

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

, которые должны быть использованы,

Благодаря Bryant для направления.

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

Update: Если вы действительно хотите просто метод Позиция, просто добавьте метод расширения.

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

Фактически в методе Load XDocument вы можете установить параметр загрузки SetLineInfo, затем вы можете придать XElements для IXMLLineInfo, чтобы получить номер строки.

вы могли бы сделать что-то вроде

var list = from xe in xmldoc.Descendants("SomeElem") 
      let info = (IXmlLineInfo)xe 
      select new 
      { 
       LineNum = info.LineNumber, 
       Element = xe 
      } 
Смежные вопросы