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?
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ê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.
static int Position(this XNode node) {
var position = 0;
foreach(var n in node.Parent.Nodes()) {
if(n == node) {
return position;
}
position++;
}
return -1;
}
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(). :)
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
}
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ả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
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