2008-10-02 49 views
5

Bất kỳ XPath nào giống như/NodeName/position() sẽ cung cấp cho bạn vị trí của nút w.r.t đó là nút cha.Cách lấy vị trí() của XElement?

Không có phương pháp nào trên đối tượng XElement (LINQ to XML) có thể lấy vị trí của phần tử. Lanhung?

Trả lời

9

Trên thực tế NodesBeforeSelf(). Đếm không làm việc vì nó được tất cả mọi thứ, ngay cả loại XText

Câu hỏi là về đối tượng XElement. Vì vậy, tôi đã tìm nó

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

nên được sử dụng,

Nhờ Bryant cho việc định hướng.

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

Bạn có thể sử dụng phương pháp NodesBeforeSelf để làm điều này:

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

Cập nhật: Nếu bạn thực sự chỉ muốn có một phương pháp Chức vụ, chỉ cần thêm một phương pháp mở rộng.

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

Bây giờ bạn chỉ có thể gọi x.Position(). :)

+0

Cảm ơn, x.NodesBeforeSelf(). Đếm() chỉ đơn giản hoạt động, tuyệt vời. Ước gì họ đã gọi nó là Vị trí trên lớp XElement. – Vin

+0

Ghi đè nhận xét trước của tôi. Kiểm tra câu trả lời của tôi dưới đây. – Vin

0

Thực tế trong phương thức tải của XDocument, bạn có thể đặt tùy chọn tải của SetLineInfo, sau đó bạn có thể gõ Xelements vào IXMLLineInfo để lấy số dòng.

bạn có thể làm một cái gì đó giống như

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

Nhưng điều đó vẫn không cung cấp cho bạn vị trí đối với cha mẹ của một nút. Không phải chỉ là số dòng? – Vin

Các vấn đề liên quan