2010-08-09 33 views
5

Estoy tratando de agregar todos los nodos en un archivo XML a ListView, y estoy haciendo algo mal, pero no puedo resolverlo incluso después de mirar una carga de ejemplos. Este es el fragmento de XML:C# Nodo XML de Foreach

<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> 

Y aquí está el código:

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

Cualquier ayuda muy apreciada como siempre.

EDIT: Para aclarar, yo estoy poniendo un NullReferenceException en

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

y sé la vista de lista no está, yo no he hecho eso todavía poco :)

+1

¿Está utilizando WPF o Winforms? Veo que estás creando una lista. ¿Cómo está ligada la lista a la vista de lista? ¿Y qué no funciona? ¿Estás recibiendo una excepción? ¿La lista simplemente no está llenando? ¿No hay nada en la lista? ¿No hay nada en Decendents? – JMarsch

+0

¡Lo siento, lo he hecho un poco más claro ahora! – JoeBeez

+1

Pruebe xDoc.Descandants ("slots") en su lugar –

Respuesta

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

esto parece más agradable, y ya que no dijiste qué es exactamente lo que está mal con tu código, es todo lo que puedo hacer.

Actualización: acaba de probar esto y soluciona su excepción.

+0

Spot on, y se ve mejor también! – JoeBeez

+0

Esto corrige la NullReferenceException ignorando el XML posiblemente mal formado e insertando un nulo para el nombre del archivo. –

+0

@Yuriy La 'NullReferenceException' fue causada por intentar acceder al nodo' filename' como un elemento del nodo 'slots', en lugar de un elemento del nodo' slot'. Puede cuidar los valores perdidos más tarde (por ejemplo, '.Where (d =>! String.IsNullOrEmpty (d.Filename))'). – Necros

2

El XML en su ejemplo funciona bien. NullReferenceException está sucediendo porque el XML real que está utilizando no tiene un elemento de nombre de archivo en uno de los espacios. Puede utilizar

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

lugar si existe un posible defecto para el filename. Pero lo más probable es que el manejo correcto de esta excepción sea mejor.

+0

+1 por encontrar su error! – 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

¿Por qué lo cambiaste para usar XmlDocument en lugar de XDocument? Luego tiene el nombre de archivo, el tamaño y el estado como atributos en lugar de elementos como se publicó originalmente. Y luego hay un misterioso _slots, ¿qué es? –

+0

Lo siento, lo ejecuté y funciona bien. Reemplaza '_slots' con' list'. Acabo de darle un nombre específico, es decir, 'private List _slots = new List ();' – JohnB

+0

Otro error tipográfico, debería ser, '_slots.Add (nuevo QueueSlot (nombre de archivo, tamaño, estado);' – JohnB