使用LINQ将XML解析为Dictionary

我有一个配置文件,如:

   ...  

我试图将其读取为XML并将其转换为字典。 我尝试编写一些代码,但这显然是错误的,因为它不能编译。

 Dictionary configDictionary = (from configDatum in xmlDocument.Descendants("Config") select new { Name = configDatum.Attribute("name").Value, Value = configDatum.Attribute("value").Value, }).ToDictionary(Something shoudl go here...?); 

如果有人能告诉我如何使这个工作,那将是非常有帮助的。 当然,我总是可以阅读它

要给出更详细的答案 – 您可以完全按照您在问题中所写的方式使用ToDictionary 。 在缺少的部分,您需要指定“键选择器”和“值选择器”这两个函数告诉ToDictionary方法您要转换的对象的哪个部分是键,哪个是值。 您已经将这两个提取为匿名类型,因此您可以编写:

 var configDictionary = (from configDatum in xmlDocument.Descendants("Config") select new { Name = configDatum.Attribute("name").Value, Value = configDatum.Attribute("value").Value, }).ToDictionary(o => o.Name, o => o.Value); 

请注意,我删除了generics类型参数规范。 C#编译器会自动计算(我们使用带有三个generics参数的重载 )。 但是,您可以避免使用匿名类型 – 在上面的版本中,您只需创建它以临时存储该值。 最简单的版本就是:

 var configDictionary = xmlDocument.Descendants("Config").ToDictionary( datum => datum.Attribute("name").Value, datum => datum.Attribute("value").Value ); 

您对ToDictionary调用需要一个键和值选择器。 从你拥有的开始,它可以

 var dictionary = yourQuery.ToDictionary(item => item.Name, item => item.Value); 

您不必进行查询,因为您只是进行投影。 将投影移动到对ToDictionary()的调用:

 var configDictionary = xmlDocument.Descendants("Config") .ToDictionary(e => e.Attribute("name").Value, e => e.Attribute("value").Value);