2011-07-26 177 views
0

任何人都可以幫助我嗎?問題與詞典<字符串,字符串>

我做了一個簡單的代碼:

private void ObterRelatorios(string id) { 
    var relatorios = new Dictionary<string, string>(); 

    var xml = new XmlDocument(); 

    xml.Load("my_path"); 

    foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes) 
     relatorios.Add(node.Attributes["Titulo"].InnerText, string.Concat(node.Attributes["Url"].InnerText, id)); 
} 

我的XML是5個節點很簡單,始終是一樣的。

這是奇怪的,因爲有時工作,有時不是。

這是我得到拋出一個異常

錯誤詳細信息時:

Exception of type 'System.Web.HttpUnhandledException' was thrown. 

完整的堆棧:

[ArgumentNullException: Value cannot be null. 
Parameter name: key] 
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) 
at System.Collections.Generic.Dictionary.Insert(TKey key, TValue value, Boolean add) 
at System.Collections.Generic.Dictionary.Add(TKey key, TValue value) 
+0

感謝您編輯我的文章! –

回答

4

錯誤說「[ArgumentNullException:值不能爲空參數名稱:key]「

的值:

node.Attributes["Titulo"].InnerText

顯然是在某些情況下空了,這是不允許的。字典條目的關鍵字不能爲空。

+0

不幸的是,這個節點總是有一個值... 這是一個永遠不會改變,並在大多數時間工作的XML! –

+0

爲什麼在失敗時使用調試器查看數據?也許有時加載XML文件時出現問題。節點不太可能具有值,並且出現此錯誤。這將表明數百萬人使用的.NET框架對象中存在一個錯誤。你的XML文件和你正在創建的XML節點之間出現問題的可能性很大。 –

+0

由於它在生產和我的機器上的大系統中,我無法模擬錯誤。 –

0

您確定您的node.Attributes["Titulo"].InnerText屬性始終有價值嗎?如果沒有,你會有ArgumentNullException。 Dictionary中的鍵不能有空值。

+0

不幸的是我確信! –

+0

你如何填充relatoriosStaticos對象? –

1

也許「Titulo」節點在某些情況下爲空。您必須在將其添加到字典之前進行檢查,因爲Key-Property不能具有空值。

這裏有一個例子來防止它。

foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes) 
{ 
    if (node.Attributes["Titulo"].InnerText == string.Empty) 
    { 
     continue; 
    } 
    else 
    { 
     relatorios.Add(node.Attributes["Titulo"].InnerText, 
      string.Concat(node.Attributes["Url"].InnerText, id)); 
    } 
} 
+0

我不知道爲什麼在某些情況下會發生這種情況,因爲xml永遠不會更改,但無論如何,我將更改爲防止代碼! 謝謝 –

0

只是說,我用ToDictionary()和兩個鍵值是相同的,當有同樣的錯誤,Value cannot be null

我沒有意識到這一點,並發現錯誤信息有點誤導,因爲我的值都不爲空。

我的解決方案(將其應用到你的問題)是把你原來的代碼:

foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes) 
     relatorios.Add(node.Attributes["Titulo"].InnerText, string.Concat(node.Attributes["Url"].InnerText, id)); 

它分成兩個部分。

首先,使用鍵列表填充List<>變量&您打算將其放入Dictionary中的值。

public class KeysAndValues 
{ 
    public string Key; 
    public string Value; 

    public override string ToString() 
    { 
     return string.Format("{0}: {1}", Key, Value); 
    } 
} 

List<KeysAndValues> dict = new List<KeysAndValues>(); 
foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes) 
{ 
    dict.Add(new KeysAndValues() 
    { 
     Key = node.Attributes["Titulo"].InnerText, 
     Value = string.Concat(node.Attributes["Url"].InnerText, id) 
    }); 
} 

接下來,獲取代碼以檢查NULL值和重複的鍵值。

如果一切正常,那麼我們可以將列表<>轉換成字典。

foreach (KeysAndValues kv in dict) 
{ 
    relatorios.Add(kv.Key, kv.Value); 
} 

這一點更多的工作,但是這是檢查Dictionary問題,而不是等待發生的異常,如果有與您的數據問題的巧妙方法。

相關問題