读取字典中的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.

我想知道我能做些什么来修改错误消息,至少提供多次出现的密钥。有人能帮忙吗?

谢谢,

哈里特

读取字典中的XML时出错

我建议不要直接创建字典,而是首先检查重复的密钥,如下所示:

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