2012-08-14 65 views
5

我有一個看起來像一個XML文件:C#加載字典從XML

<Cities> 
    <Name>Seattle</Name> 
    <State>WA</State> 
    <Population>552105</Population> 
</Cities> 

我想這個城市的信息加載到一個字典,讓我的字典裏是這樣的:

cityDictionary("Name") = "Seattle" 
cityDictionary("State") = "WA" 
cityDictionary("Population") = "552105" 

的以下代碼確實有效:

var doc = XDocument.Load(@"..\..\Cities.xml"); 
var rootNodes = doc.Root.DescendantNodes().OfType<XElement>(); 
var keyValuePairs = from n in rootNodes 
        select new 
        { 
         TagName = n.Name, 
         TagValue = n.Value 
        }; 

Dicitionary<string, string> allItems = new Dictionary<string, string>(); 
foreach (var token in keyValuePairs) { 
    allItems.Add(token.TagName.ToString(), token.TagValue.ToString()); 
} 

但我想這樣做一步。

有什麼建議嗎?

+0

爲什麼不直接將工作代碼重構爲方法? – 2012-08-14 15:31:15

+0

你爲什麼想用一種表達方式來做? (當你說「step」時,我假設你的意思是「表達」?) – Richard 2012-08-14 15:31:18

回答

8

爲什麼這麼複雜?這裏是你如何能做到這一點的方法鏈語法:

var allItems = rootNodes.ToDictionary(n => n.Name.ToString(), n => n.Value); 

或者只是作爲一個普通的老循環,如果你需要使用C#的舊版本或者想保持的東西老土:

var allItems = new Dictionary<string, string>(); 
foreach (var node in rootNodes) 
{ 
    allItems.Add(node.Name.ToString(), node.Value); 
} 
5

試試這個使用ToDictionary.

Dictionary<string, string> allItems = rootNodes.ToDictionary(v => v.Name, v => v.Value); 
+1

你不需要在這裏創建匿名對象,忘記理解表達式:'rootNodes.ToDictionary(n => n.Name,n => n .value的)'。 – Richard 2012-08-14 15:35:18

+0

感謝理查德,更新了我的答案 – Adil 2012-08-14 15:36:32

+0

哎,理查德,你打敗了我。 – Adam 2012-08-14 15:36:41

0

二者必選其一 在這個例子中,你必須確保標記名轉換成字符串

Dictionary<string, string> allItems = (from n in rootNodes 
select new 
      { 
       TagName = n.Name, 
       TagValue = n.Value 
      }).ToDictionary(v => v.TagName.ToString(), v => v.TagValue); 

或存放的XName關鍵

Dictionary<XName, string> allItems = (from n in rootNodes 
select new 
      { 
       TagName = n.Name, 
       TagValue = n.Value 
      }).ToDictionary(v => v.TagName, v => v.TagValue); 
0
var element = xmlDoc.Root.Element("Cities"); 
      if (element != null) 
      { 
       var idList = element.Descendants().Where(p_ => p_.Name == "Name").Select(v_ => v_.Value).ToArray(); 
       var valList = element.Descendants().Where(p_ => p_.Name == "Population").Select(v_ => v_.Value).ToArray(); 

       var citiesDictionary = idList.Zip(valList, (key_, value_) => new { k = key_, v = value_ }).ToDictionary(x_ => x_.k, x_ => x_.v);