读取字典中的XML时出错
本文关键字:出错 XML 字典 读取 | 更新日期: 2023-09-27 17:57:47
我有一个XML文件,如下所示:
<APICollection><API name="myapiName" message="myAPIMessage" /></APICollection>
当我试着在这样的字典里读这个:
Dictionary<string,string> apiMap = new Dictionary<string,string>();
XDocument xdoc = XDocument.Load(path);
apiMap = xdoc.Root.Elements()
.ToDictionary(a => (string)a.Attribute("apiName"), a => (string)a.Attribute("apiMessage"));
一切都很好。但是,如果我有多个具有相同密钥(名称)的条目,我会得到一个类似这样的通用异常:
An item with the same key has already been added.
我想知道我能做些什么来修改错误消息,至少提供多次出现的密钥。有人能帮忙吗?
谢谢,
哈里特
我建议不要直接创建字典,而是首先检查重复的密钥,如下所示:
XDocument xdoc = XDocument.Load(path);
var apiMap = xdoc.Root.Elements()
.Select(a => new
{
ApiName = (string)a.Attribute("apiName"),
ApiMessage = (string)a.Attribute("apiMessage")
});
var duplicateKeys = (from x in apiMap
group x by x.ApiName into g
select new { ApiName = g.Key, Cnt = g.Count() })
.Where(x => x.Cnt > 1)
.Select(x => x.ApiName);
if (duplicateKeys.Count() > 0)
throw new InvalidOperationException("The following keys are present more than once: "
+ string.Join(", ", duplicateKeys));
Dictionary<string, string> apiMapDict =
apiMap.ToDictionary(a => a.ApiName, a => a.ApiMessage);
请注意,我已经更改了代码,即您的示例中的属性名称("name"、"message")和代码示例中的特性名称("apiName"、"apiMessage")之间存在差异。
Attribute
方法采用属性名称,而不是值。将值替换为属性名称。还可以使用Value
属性来获取属性的值。
即使这样做,用作密钥的属性值也需要是唯一的,因为您使用的是Dictionary<T,T>
Dictionary<string,string> apiMap = new Dictionary<string,string>();
XDocument xdoc = XDocument.Load(path);
apiMap = xdoc.Root.Elements()
.ToDictionary(a => a.Attribute("name").Value
, a => a.Attribute("message").Value);
试试这个:
var xmlDocument = XDocument.Load(path);
var values = xmlDocument
.Descendants("API")
.GroupBy(x => (string)x.Attribute("name"))
.ToDictionary(x => x.Key,
x => x.Select(p => (string)p.Attribute("message").ToList());
这将给您一个Dictionary<string, List<string>>
,键是名称,值是属于Api名称的消息。如果你只想要Dictionary,那么就这样更改代码:
var values = xmlDocument
.Descendants("API")
.GroupBy(x => (string)x.Attribute("name"))
.ToDictionary(x => x.Key,
x => (string)x.First().Attribute("message"));