2010-01-11 23 views
6

Tôi có XML sau, được tạo ra bởi một thư viện của bên thứ 3:Làm thế nào để bạn xác định thứ tự kết quả nút bằng XPath?

<PhoneNumbers> 
    <PhoneNumber Key="1">123-456-7890</PhoneNumber> 
    <PhoneNumber Key="2">234-567-8901</PhoneNumber> 
    <PhoneNumber Key="3">345-678-9012</PhoneNumber> 
</PhoneNumbers>

Vấn đề là tôi không nên phụ thuộc vào giá trị của các thuộc tính Key (a) xuất hiện theo thứ tự, hoặc (b) bắt đầu lúc 1. Hơn thế nữa, nhưng tôi muốn quá trình xử lý này an toàn nhất có thể.

Điều tôi cần làm là lấy danh sách các số điện thoại, được sắp xếp theo giá trị Key (tăng dần). Vì vậy, bằng cách sử dụng XmlNode.SelectNodes Tôi muốn kết quả XmlNodeList để chứa các nút PhoneNumber theo thứ tự thích hợp, không nhất thiết theo thứ tự chúng xuất hiện.

Làm cách nào để thực hiện điều này bằng XPath?
Điều này có thể thực hiện trực tiếp không?

Nếu nó tạo sự khác biệt, tôi đang sử dụng .NET 2.0.

Trả lời

4

XPath tự nó không xác định bất cứ điều gì cho điều đó.

Đối với C# .NET, đây có thể là những gì bạn đang tìm kiếm: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/

+0

+1 Ví dụ trong đó chính xác là những gì tôi cần. Cảm ơn. –

+0

Nó sẽ không dễ dàng hơn nhiều trong trường hợp cụ thể này để chọn điện thoại ## vào một danh sách chuỗi và sau đó sắp xếp nó? – ajeh

3

này không thể được thực hiện với XPath. Nếu bạn đang sử dụng một số XPathDocument, bạn có thể sử dụng phương thức AddSort.

Tuy nhiên nếu bạn đang sử dụng XmlDocument (và/hoặc cần cập nhật DOM XML), có thể dễ dàng kết xuất SelectNodes thành một SortedDictionary bằng cách sử dụng giá trị của Thuộc tính khóa làm Giá trị khóa .

3

Dưới đây là ví dụ về cách thực hiện với XPathExpression bằng phương pháp AddSort đã được đề cập. XPathExpression có sẵn với.Net 2.0 (http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx)

private static void XmlTest() 
{ 
    XPathDocument results = new XPathDocument(@"c:\temp\temp.xml"); 
    XPathNavigator navigator = results.CreateNavigator(); 
    XPathExpression selectExpression = navigator.Compile("/PhoneNumbers/PhoneNumber"); 
    XPathExpression sortExpr = navigator.Compile("@Key"); 
    selectExpression.AddSort(sortExpr, XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text); 
    XPathNodeIterator nodeIterator = navigator.Select(selectExpression); 
    int i = 0; 
    while (nodeIterator.MoveNext()) 
    { 
     Console.WriteLine(nodeIterator.Current.Value); 
     i++; 
    } 
} 
Các vấn đề liên quan