2011-01-26 95 views
4

我有一个配置文件,如:使用LINQ to XML解析成字典

<ConfigurationFile> 
    <Config name="some.configuration.setting" value="some.configuration.value"/> 
    <Config name="some.configuration.setting2" value="some.configuration.value2"/> 
    ... 
</ConfigurationFile> 

我想读这XML并将其转换为一个字典。我尝试编码这个谎言,但它显然是错误的,因为它不编译。

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

如果有人能告诉我如何得到这个工作,这将是非常有益的。我当然可以阅读它

回答

14

下面给出更详细的解答 - 您可以使用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); 

请注意,我删除了泛型类型参数说明。 C#编译器自动计算出这个数字(我们使用的是overload with three generic arguments)。但是,您可以避免使用匿名类型 - 在上述版本中,只需创建它即可临时存储该值。最简单的版本将会是:

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

非常感谢。 – PolandSpring 2011-01-26 18:18:01

0

您致电ToDictionary需要一个键和值选择器。与你有开始,也可以是

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

对不起,这对我来说不是很清楚。这段代码去哪里? – PolandSpring 2011-01-26 04:20:38

0

不需要查询,因为您只是在进行投影。将投影移至ToDictionary()

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