2010-08-09 63 views
5

我想將一個XML文件中的所有節點添加到一個listView,我做錯了什麼,但我不能爲我的生活找出它甚至在看到一個負載後的例子。這是XML片段:C#Foreach 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> 

而這裏的代碼:

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

任何幫助非常感謝一如既往。

編輯:爲了澄清,我越來越對

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

一個NullReferenceException而且我知道ListView中丟失,我沒有做到這一點位仍然:)

+1

你使用的是WPF還是Winforms?我看到你創建一個列表。列表如何綁定到列表視圖? 什麼不工作?你是否遇到異常?該列表是否沒有填充?有沒有在列表視圖中?後嗣中沒有什麼? – JMarsch 2010-08-09 15:56:30

+0

對不起,我現在已經更清楚一點了! – JoeBeez 2010-08-09 15:58:27

+1

嘗試xDoc.Descandants(「插槽」),而不是 – 2010-08-09 15:58:59

回答

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

這看起來更好,因爲你沒有說你的代碼有什麼問題,而是我所能做的。

更新:剛剛測試過這個,它修復了你的異常。

+0

現貨上,它看起來更好! – JoeBeez 2010-08-09 16:13:10

+0

通過忽略可能格式不正確的XML併爲文件名插入null來修復NullReferenceException。 – 2010-08-09 16:26:41

+0

@Yuriy'NullReferenceException'是因爲嘗試訪問'filename'節點作爲'slots'節點的元素而不是'slot'節點的元素而引起的。稍後可以保留缺失的值(例如'.Where(d =>!string.IsNullOrEmpty(d.Filename))')。 – Necros 2010-08-09 16:34:59

2

您示例中的XML工作正常。發生NullReferenceException是因爲您正在使用的真正的XML在其中一個插槽中沒有文件名元素。您可以使用

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

而不是如果filename有可能的默認值。但更有可能正確處理此異常更好。

+0

+1找到他的bug! – JohnB 2010-08-09 16:23:28

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

爲什麼你將它改爲使用XmlDocument而不是XDocument?然後你將文件名,大小和狀態作爲屬性而不是最初發布的元素。然後有一個神祕的_slots,它是什麼? – 2010-08-09 16:12:18

+0

對不起,我運行它,它雖然工作。用'list'替換'_slots'。我只是給它一個特定的名稱,即'私人列表 _slots =新列表();' – JohnB 2010-08-09 16:17:20

+0

另一個錯字雖然,應該是,'_slots.Add(新的QueueSlot(文件名,大小,狀態);' – JohnB 2010-08-09 16:20:00