2010-01-11 13 views
6

mam następujące XML, który jest generowany przez bibliotekę 3rd-Party:Jak określić kolejność wyników węzła za pomocą XPath?

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

Kwestia jest taka, że ​​nie powinna być uzależniona od wartości atrybutu Key (a) pojawiające się w porządku, albo (b) zaczynając od 1. Więcej na ten drugi, ale chcę, aby to przetwarzanie było tak bezpieczne, jak to tylko możliwe.

Co należy zrobić, to uzyskać listę numerów telefonów posortowaną według wartości Key (rosnąco). Tak więc używając XmlNode.SelectNodes chciałbym, aby wynikowy XmlNodeList zawierał węzły PhoneNumber w odpowiedniej kolejności, niekoniecznie w takiej kolejności, w jakiej się pojawiają.

Jak można tego dokonać przy użyciu XPath?
Czy można to zrobić bezpośrednio?

Jeśli robi różnicę, używam .NET 2.0.

Odpowiedz

3

To nie może być dokonany z XPath. Jeśli używasz XPathDocument, możesz użyć metody AddSort.

Jednakże, jeśli już używasz XmlDocument (i/lub potrzebujesz móc zaktualizować XML DOM), prawdopodobnie łatwo zrzucisz wynik SelectNodes do SortedDictionary używając wartości atrybutu Key jako wartości Key .

3

Oto przykład, jak to zrobić za pomocą XPathExpression, używając już wspomnianej metody AddSort. XPathExpression jest dostępny z .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++; 
    } 
} 
Powiązane problemy