2011-06-17 71 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文件获取数据到字符串数组共享的方式))