2011-06-17 43 views
0

我試圖在將項目放入組合框之前對項目進行排序。繼承人我使用的代碼使用C#排序來自XML文件的數據:不排序

public void InitializeDropDown(string XmlFile, string xpath) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(XmlFile); 

    XPathNavigator navigator = doc.CreateNavigator(); 
    XPathExpression expression = navigator.Compile(xpath); 

    expression.AddSort("name", XmlSortOrder.Descending, 
     XmlCaseOrder.UpperFirst, 
     string.Empty, XmlDataType.Text); 

    XPathNodeIterator iterator = navigator.Select(expression); 

    foreach (XPathNavigator item in iterator) 
    { 
     WeatherServicesCBO.Items.Add(item.Value); 
    } 
} 

我認爲這將是對XML數據進行排序的正確方法,我錯過了什麼?

編輯:以下是我迄今爲止嘗試過的一些其他技術,要麼不排序,我會得到一個錯誤。

第一次嘗試(不排序)

public void InitializeDropDown(string XmlFile, string xpath) 
{ 
    var doc = new XmlDocument(); 
    doc.Load(XmlFile); 

    XPathNavigator navigator = doc.CreateNavigator(); 
    XPathExpression expression = navigator.Compile(xpath); 

    expression.AddSort("@name", XmlSortOrder.Descending, 
     XmlCaseOrder.UpperFirst, 
     string.Empty, XmlDataType.Text); 

    XPathNodeIterator iterator = navigator.Select(expression); 

    foreach (XPathNavigator item in iterator) 
    { 
     WeatherServicesCBO.Items.Add(item.Value); 
    } 
} 

第二次嘗試(給出錯誤非泛型類型 'System.Collections.IEnumerable' 不能與類型參數一起使用

public void InitializeDropDown(string XmlFile, string xpath) 
{ 
    string[] services = { "Google Weather", "Yahoo! Weather", "NOAA", "WeatherBug" }; 

    IEnumerable<string> query = from service in services 
           orderby service.Substring(0, 1) ascending 
           select service; 

    foreach (string @string in query) 
     WeatherServicesCBO.Items.Add(@string); 
} 

第三次嘗試(獲得NullReferenceException)

public void InitializeDropDown(string XmlFile, string xpath) 
{ 
    var doc = XDocument.Load(XmlFile); 

    foreach (var item in doc.XPathSelectElements(xpath).OrderByDescending(n => n.Attribute("name").Value)) 
     WeatherServicesCBO.Items.Add(item); 

} 
+0

爲什麼你不包括你的XML數據樣本? – 2011-06-17 18:53:35

回答

2

你的代碼似乎是正確的,並且必須正常工作。你可能錯過了一些東西:

1。 XML是一種區分大小寫的語言,所以不要使用「名稱」而不是「名稱」。

2。 AddSort方法的第一個參數必須是相對xpath。所以如果您指的是您所指節點中名爲「name」的屬性,請使用「@name」。

考慮這個XML:

<a> 
    <b foo="bb"> 
    <name>KKKK</name> 
    </b> 
    <b foo="aa"> 
    <name>AAAA</name> 
    </b> 
</a> 

你可以寫:

expression.AddSort("name" ,.. 

expression.AddSort("@foo", ... 

反正如果我是你,我會使用LINQ到XML:

public void InitializeDropDown2(string XmlFile, string xpath) 
     { 
      var document = XDocument.Load(XmlFile); 
      foreach (var item in document.XPathSelectElements(xpath).OrderByDescending(n=>n.Attribute("foo").Value)) 
      { 
       comboBox1.Items.Add(item.Value); 
      } 
     } 
+0

我編輯了我的原始文章,以反映我嘗試過的所有內容 – PsychoCoder 2011-06-17 18:08:06

0

這種方法完美地工作(當我加入__using System.Collections.Generic;。一旦我做了所有被罰款

public void InitializeDropDown(string XmlFile, string xpath) 
{ 

    string[] services = { "Google Weather", "Yahoo! Weather", "NOAA", "WeatherBug" }; 

    IEnumerable<string> query = from service in services 
           orderby service.Substring(0, 1) ascending 
           select service; 

    foreach (string @string in query) 
     WeatherServicesCBO.Items.Add(@string); 
} 

現在我需要做的就是從XML文檔中的值轉換爲字符串數組。感謝大家的幫助(我知道從XML文件獲取數據到字符串數組共享的方式))