2011-07-26 32 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 [」言う:Valueはできませんパラメータ名:キー] "

の値:

node.Attributes["Titulo"].InnerText

は明らかにいくつかのケースではnullで、これは許可されていません。辞書項目のキーはnullにすることはできません。

+0

残念なことに、このノードは常に内部に値を持っています... これは決して変わらず、ほとんどの時間で動作するXMLです! –

+0

エラーが発生したときにデバッガを使用してデータを確認するのはなぜですか?たぶん、XMLファイルをロードするときに問題が生じることがあります。ノードに値がある可能性は非常に低く、このエラーが発生しています。これは、何百万人もの人々が使用している.NETフレームワークオブジェクトのバグを示しています。あなたのXMLファイルとそこから作成しているXMLノードの間に何か間違ったことが起こっている可能性は非常に高いです。 –

+0

生産上の大きなシステムにあり、私のマシンではエラーをシミュレートできません。 –

0

node.Attributes["Titulo"].InnerText属性には常に価値がありますか?そうでない場合、ArgumentNullExceptionが発生します。 Dictionaryのキーにはnull値を設定することはできません。

+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、これと同じエラーを持っていたし、キー値の2は同じでした。

私はこれを認識しておらず、私の値のどれもがnullでないため、少し誤解を招くエラーメッセージが見つかりました。

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

2つの部分に分割:(あなたの問題への適用)

私のソリューションは、あなたの元のコードを取ることであろう。

まず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値と重複したKey値をチェックするコードを取得します。

すべてがうまくいけば、リスト<を辞書に変換できます。

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

それはもう少し作業だが、これはむしろ例外が発生するためにあなたのデータに問題がある場合は、待っているよりも、Dictionary問題をチェックするためにきちんとした方法である

関連する問題