2010-01-11 74 views
6

我有下面的XML,它是由一個第三方庫生成:如何使用XPath指定節點結果順序?

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

的問題是,我不應該依賴於Key屬性的值(一)出現順序,或(b )從1開始。更多的是後者,但我希望這個處理儘可能安全。

我需要做的是獲取電話號碼列表,按Key值(升序)排序。因此,通過使用XmlNode.SelectNodes,我希望得到的XmlNodeList以正確的順序包含PhoneNumber節點,而不一定按照它們出現的順序。

這是如何使用XPath完成的?
這可能直接做?

如果它有所作爲,我使用.NET 2.0。

回答

3

這不能使用XPath來完成。如果您使用的是XPathDocument,則可以使用AddSort方法。

但是,如果您已經在使用XmlDocument(和/或需要能夠更新XML DOM),那麼使用Key屬性的值作爲Key值可能很容易將SelectNodes的結果轉儲到SortedDictionary

3

下面是如何使用已提及的AddSort方法使用XPathExpression完成此操作的示例。 XPathExpression可用於.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++; 
    } 
}