2012-08-14 12 views
5

Mam plik XML, który wygląda tak:C słownik # obciążenia z XML

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

Chcę załadować informacji Miasto w słowniku, tak że mój słownik wygląda następująco:

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

The następujący kod działa:

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()); 
} 

Ale chcę zrobić to jednym krokiem.

Wszelkie sugestie?

+0

Dlaczego po prostu nie przekształcisz swojego działającego kodu w metodę? –

+0

Dlaczego chcesz to zrobić w jednym wyrażeniu? (Zakładam, że masz na myśli "wyrażenie", kiedy mówisz "krok"?) – Richard

Odpowiedz

8

Dlaczego tak skomplikowane? Oto w jaki sposób można to zrobić w składni łańcucha metoda:

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

lub po prostu jako zwykły starej pętli, jeśli trzeba użyć starszej wersji C# lub chciałbyś zachować rzeczy staromodny:

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

Spróbuj używając ToDictionary.

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

Nie musisz tutaj tworzyć anonimowego obiektu, zapomnij o wyrażeniu zrozumiałym: 'rootNodes.ToDictionary (n => n.Nazwa, n => n .Value) '. – Richard

+0

Dzięki Richard, Zaktualizowałem moją odpowiedź – Adil

+0

ouch Richard, pobiłeś mnie do tego. – Adam

0

Zastosowanie albo W tym przykładzie należy upewnić się, że zmienna jest konwertowany do łańcucha

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

ani przechowywać XName jako kluczowy

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