如何获得XElement的position()?

时间:2008-10-02 20:12:21

标签: linq linq-to-xml

像/ NodeName / position()之类的任何XPath都会为你提供节点w.r.t它的父节点的位置。

XElement(Linq to XML)对象上没有可以获取Element位置的方法。有吗?

4 个答案:

答案 0 :(得分:9)

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

问题是关于XElement对象的。 所以我认为它是

int position = obj.ElementsBeforeSelf().Count();
应该使用

感谢布莱恩特的指导。

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

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

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

现在你可以调用x.Position()。 :)

答案 2 :(得分: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;
}

答案 3 :(得分: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
           }