2010-01-11 3 views
6

Ich habe die folgende XML, die von einer 3rd-Party-Bibliothek generiert:Wie legen Sie die Reihenfolge der Knotenergebnisse mithilfe von XPath fest?

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

Das Problem ist, dass ich nicht auf den Werten des Key Attributs (a) erscheinen in Ordnung, oder (b abhängen) beginnend mit 1. Mehr letzteres, aber ich möchte, dass diese Verarbeitung so sicher wie möglich ist.

Was ich tun muss, ist eine Liste der Telefonnummern, sortiert nach dem Key Wert (aufsteigend). So mit XmlNode.SelectNodes möchte ich die resultierende XmlNodeList die PhoneNumber Knoten in der richtigen Reihenfolge enthalten, nicht unbedingt in der Reihenfolge, in der sie erscheinen.

Wie kann dies mit XPath erreicht werden?
Ist das direkt möglich?

Wenn es einen Unterschied macht, verwende ich .NET 2.0.

Antwort

3

Dies kann nicht mit XPath erreicht werden. Wenn Sie eine XPathDocument verwenden, können Sie die AddSort Methode verwenden.

Wenn Sie jedoch bereits XmlDocument verwenden (und/oder das XML-DOM aktualisieren müssen), ist es wahrscheinlich einfach, das Ergebnis von SelectNodes in eine SortedDictionary mit dem Wert des Key-Attributs als Schlüsselwert abzulegen .

3

Hier ist ein Beispiel, wie man es mit XPathExpression unter Verwendung der bereits erwähnten AddSort-Methode macht. XPathExpression ist verfügbar with.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++; 
    } 
} 
Verwandte Themen