2010-08-09 5 views
5

J'essaie d'ajouter tous les noeuds dans un fichier XML dans un ListView, et je fais quelque chose de mal mais je ne peux pas pour la vie de moi comprendre même après avoir regardé une charge d'exemples. Ceci est l'extrait de code XML:C# Foreach Noeud XML

<queue> 
<slots> 
<slot> 
<status>Downloading</status> 
<filename>file1</filename> 
<size>1 GB</size> 
</slot> 
<slot> 
<status>Downloading</status> 
<filename>file2</filename> 
<size>2 GB</size> 
</slot> 
</slots> 
</queue> 

Et voici le code:

 XDocument xDoc = XDocument.Load(xmlFilePath); 

     List<Download> list = new List<Download>(); 

     foreach (var download in xDoc.Descendants("slots")) 
     { 
      string filename = download.Element("filename").Value; 
      string size = download.Element("size").Value; 
      string status = download.Element("status").Value; 
      list.Add(new Download { Filename = filename, Size = size, Status = status });    
     } 

Toute aide grandement appréciée comme toujours.

EDIT: Pour clarifier les choses, je reçois un NullReferenceException sur

string filename = download.Element("filename").Value; 

Et je sais que le listview manque, je l'ai pas fait encore peu :)

+1

Utilisez-vous WPF ou Winforms? Je vous vois créer une liste. Comment la liste est-elle liée à la liste? Et qu'est-ce qui ne fonctionne pas? Avez-vous une exception? Est-ce que la liste ne remplit pas? N'y a-t-il rien dans la liste? N'y a-t-il rien dans Decends? – JMarsch

+0

Désolé, je l'ai fait un peu plus clair maintenant! – JoeBeez

+1

Essayez xDoc.Descandants ("slots") à la place –

Répondre

3
var list = (from download in xDoc.Descendats("slot") 
      select new Download 
        { 
         Filename = (string) download.Element("filename"), 
         Size = (string) download.Element("size"), 
         Status = (string) download.Element("status") 
        }).ToList(); 

Ce look plus agréable, et puisque vous n'avez pas dit exactement ce qui ne va pas avec votre code, c'est à peu près tout ce que je peux faire.

Mise à jour: juste testé cela, et il corrige votre exception.

+0

Spot sur, et il a l'air plus agréable aussi! – JoeBeez

+0

Cela corrige l'exception NullReferenceException en ignorant le code XML éventuellement mal formé et en insérant une valeur null pour le nom de fichier. –

+0

@Yuriy Le 'NullReferenceException' a été provoqué en essayant d'accéder au noeud' filename' en tant qu'élément du noeud 'slots', au lieu d'un élément du noeud' slot'. Vous pouvez prendre soin des valeurs manquantes plus tard (par exemple '.Where (d =>! String.IsNullOrEmpty (d.Filename))'). – Necros

2

Le code XML de votre exemple fonctionne correctement. L'exception NullReferenceException se produit car le code XML réel que vous utilisez n'a pas d'élément filename dans l'un des emplacements. Vous pouvez utiliser

string filename = download.Element("filename") == null ? 
    String.Empty : download.Element("filename").Value; 

place en cas de défaut possible pour le filename. Mais plus probablement la gestion correcte de cette exception est meilleure.

+0

+1 pour trouver son bug! – JohnB

1
void LoadSlots() 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(Environment.CurrentDirectory + "\\queue.xml"); 

    XmlNodeList nodes = doc.SelectNodes("//queue/slots/slot"); 

    foreach (XmlNode node in nodes) 
    { 
    string filename = node.Attributes["filename"].InnerText; 
    string size = node.Attributes["size"].InnerText; 
    string status = node.Attributes["status"].InnerText; 
    _slots.Add(filename, size, status); 
    } 
} 
+0

Pourquoi l'avez-vous modifié pour utiliser XmlDocument au lieu de XDocument? Ensuite, vous avez le nom du fichier, la taille et le statut en tant qu'attributs au lieu des éléments tels qu'ils ont été affichés à l'origine. Et puis il y a un _slots cryptique, qu'est-ce que c'est? –

+0

Désolé, je l'ai couru et cela fonctionne bien. Remplacez '_slots' par' list'. Je viens de lui donner un nom spécifique, à savoir 'Liste privée _slots = nouvelle Liste ();' – JohnB

+0

Une autre faute de frappe, devrait être, _slots.Add (nouveau QueueSlot (nom de fichier, taille, statut); ' – JohnB