2010-08-09 19 views
5

Bir XML dosyasındaki tüm düğümleri bir listeye eklemeyi deniyorumView ve yanlış bir şey yapıyorum ama bir yüke baktıktan sonra bile hayatımı anlayamıyorum Örnekler Bu XML snippet'tir:C# Foreach XML düğümü

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

Ve burada kod:

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

Herhangi bir yardım büyük her zaman olduğu gibi takdir.

DÜZENLEME:

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

üzerinde bir NullReferenceException alıyorum, netleştirmek için Ve listview eksik biliyor, bunu henüz biraz yapmadık :)

+1

WPF veya Winforms kullanıyor musunuz? Bir liste oluştururken görüyorum. Liste liste görünümüne nasıl bağlanır? Ve ne çalışmıyor? Bir istisna mı alıyorsun? Liste doldurmuyor mu? Liste görünümünde hiçbir şey yok mu? Decendents'da hiç bir şey yok mu? – JMarsch

+0

Üzgünüz, şimdi biraz daha netleştirdim! – JoeBeez

+1

xDoc.Descandants ("yuva") yerine XDoc.Descandants ("yuvaları") deneyin –

cevap

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

Bu görünüyor daha güzel ve kodunuzda tam olarak neyin yanlış olduğunu söylemediğinden, yapabileceğim tek şey bu.

Güncelleştirme: Yalnızca bunu test ettik ve istisnayı düzeltir.

+0

Üzerinde nokta ve çok güzel görünüyor! – JoeBeez

+0

Bu, olası hatalı biçimlendirilmiş XML'yi göz ardı ederek ve dosya adı için bir boş değer ekleyerek NullReferenceException'ı düzeltir. –

+0

@Yuriy 'NullReferenceException',' filename 'düğümü 'slot' düğümünden ziyade' yuva 'düğümünün bir öğesi olarak erişmeye çalışmaktan kaynaklandı. Daha sonra eksik olan değerlere dikkat edebilirsiniz (ör., .Where (d => string.IsNullOrEmpty (d.Filename))). – Necros

2

Örneğindeki XML iyi çalışıyor. NullReferenceException gerçekleşiyor çünkü kullandığınız gerçek XML, yuvalardan birinde bir dosya adı öğesine sahip değil. filename için olası bir varsayılan vardır yerine eğer

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

kullanabilirsiniz. Ancak bu istisnayı doğru şekilde ele almak daha doğrudur.

+0

+ 1! – 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

XDocument yerine XmlDocument'i kullanmak için neden değiştirdiniz? Daha sonra, orijinal olarak gönderilen öğeler yerine dosya adı, boyut ve statüye sahip olursunuz. Ve sonra bir şifreli _slot var, ne var? –

+0

Üzgünüz, koştum ve işe yarıyor. '_slots'' 'list' ile değiştirin. Sadece özel bir isim verdim, yani 'Özel Liste _slots = yeni Liste (); – JohnB

+0

Başka bir yazım hatası olsa da,' _slots.Add (yeni KuyrukSlot (dosya adı, boyut, durum); ' – JohnB