2011-06-17 5 views
0

J'essaie de trier les éléments avant qu'ils ne soient placés dans la liste déroulante. Heres le code que j'utiliseTri des données du fichier XML avec C#: Non Tri

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); 
    } 
} 

Je pensais que ce serait le bon moyen de trier les données XML, qu'est-ce qui me manque?

EDIT: Voici d'autres techniques que j'ai essayées jusqu'ici soit ne sorte de je reçois une erreur.

premier essai (aucun tri)

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); 
    } 
} 

deuxième tentative (donne erreur type non générique System.Collections.IEnumerable »ne peut pas être utilisé avec des arguments de type)

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); 
} 

Troisième tentative (obtenir une exception 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

pourquoi ne pas inclure votre échantillon de données xml? –

Répondre

2

votre code semble correct et doit fonctionner correctement. vous pourriez avoir manqué certaines choses:

1. XML est un langage sensible à la casse, n'utilisez donc pas "name" au lieu de "Name".

2. le premier paramètre de la méthode AddSort doit être un chemin xpath relatif. donc si vous voulez dire l'attribut nommé "nom" dans le nœud dont vous parlez, utilisez "@nom".

considèrent ce XML:

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

vous pouvez écrire:

expression.AddSort("name" ,.. 

ou

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

Quoi qu'il en soit, si je vous, je voudrais utiliser LINQ to 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

J'ai édité mon post original pour refléter tout ce que j'ai essayé – PsychoCoder

0

Cette méthode a parfaitement fonctionné (une fois que j'ajouté __using System.Collections.Generic; .Une fois je l'ai fait tout allait bien

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); 
} 

Maintenant, tout ce que je dois faire est d'obtenir les valeurs du document XML dans un tableau de chaînes . Merci à tous pour votre aide (je vous connais un moyen d'obtenir les données du fichier XML en partage de la chaîne de caractères;)