Как получить позицию () XElement? - PullRequest
6 голосов
/ 03 октября 2008

Любой XPath, подобный / NodeName / position (), даст вам позицию узла с его родительским узлом.

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

Ответы [ 4 ]

9 голосов
/ 03 октября 2008

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

Вопрос был об объекте XElement. Итак, я подумал, что это

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

что следует использовать,

Спасибо Брайанту за направление.

5 голосов
/ 03 октября 2008

Вы можете использовать метод 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 (). :)

0 голосов
/ 03 октября 2008

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

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

var list = from xe in xmldoc.Descendants("SomeElem")
           let info = (IXmlLineInfo)xe
           select new 
           {
              LineNum = info.LineNumber,
              Element = xe
           }
0 голосов
/ 03 октября 2008
static int Position(this XNode node) {
  var position = 0;
  foreach(var n in node.Parent.Nodes()) {
    if(n == node) {
      return position;
    }
    position++;
  }
  return -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...