任何人都可以帮助我吗?
我有一个简单的代码:
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不能为null。参数名称:key]”
值:
node.Attributes["Titulo"].InnerText
在某些情况下显然为空,这是不允许的。字典条目的键不能为空。
答案 1 :(得分:1)
在某些情况下,“Titulo”节点可能是空的。您必须先检查它,然后才能将其添加到Dictionary中,因为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));
}
}
答案 2 :(得分:0)
您确定自己的node.Attributes["Titulo"].InnerText
属性总是有价值吗?如果没有,你将有ArgumentNullException。 “字典”中的键不能为空值。
答案 3 :(得分:0)
只是说,在使用Value cannot be null
时,我有同样的错误ToDictionary()
,其中两个Key值相同。
我没有意识到这一点,并发现错误信息有点误导,因为我的值都没有。
我的解决方案(将其应用于您的问题)将采用您的原始代码:
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值和重复的Key值。
如果一切顺利,那么我们可以转换List&lt;&gt;进入字典。
foreach (KeysAndValues kv in dict)
{
relatorios.Add(kv.Key, kv.Value);
}
它还有一点工作,但如果您的数据存在问题,这是检查Dictionary
问题的一种巧妙方法,而不是等待异常发生。