如何获取XElement的position()?

时间:2020-03-06 15:02:51  来源:igfitidea点击:

像/ NodeName / position()这样的任何XPath都会为我们提供其父节点的节点位置。

XElement(Linq to XML)对象上没有任何方法可以获取Element的位置。在那儿?

解决方案

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

更新:如果我们真的只想要一个Position方法,只需添加一个扩展方法。

public static class ExMethods
{
    public static int Position(this XNode node)
    {
        return node.NodesBeforeSelf().Count();  
    }
}

现在,我们只需调用x.Position()。 :)

实际上NodesBeforeSelf()。Count不起作用,因为它甚至可以获取XText类型的所有内容

问题是关于XElement对象。
所以我想是

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

应该使用的,

感谢科比的指导。

实际上,我们可以在XDocument的Load方法中设置SetLineInfo的加载选项,然后可以将XElements强制转换为IXMLLineInfo以获取行号。

你可以做类似的事情

var list = from xe in xmldoc.Descendants("SomeElem")
           let info = (IXmlLineInfo)xe
           select new 
           {
              LineNum = info.LineNumber,
              Element = xe
           }