2012-08-14 5 views
5

ich eine XML-Datei, die wie folgt aussieht:C# Load-Wörterbuch von XML

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

I info die Stadt in ein Wörterbuch geladen werden soll, so dass mein Wörterbuch wie folgt aussieht:

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

Die folgender Code funktioniert:

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

Aber ich möchte diesen einen Schritt tun.

Irgendwelche Vorschläge?

+0

Warum refactorieren Sie Ihren Arbeitscode nicht einfach in eine Methode? –

+0

Warum möchten Sie es in einem Ausdruck tun? (Ich nehme an, Sie meinen "Ausdruck", wenn Sie "Schritt" sagen?) – Richard

Antwort

8

Warum so komplex, mit? Hier ist, wie Sie es in der Methode Kette Syntax tun könnte:

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

oder einfach nur als einfache alte Schleife, wenn Sie eine ältere Version von C# verwenden oder möchten Dinge halten altmodischen:

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

Versuchen Sie, diese ToDictionary.

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

Sie müssen das anonyme Objekt hier nicht erstellen, vergessen Sie den Verständnisausdruck: 'rootNodes.ToDictionary (n => n.Name, n => n .Wert) '. – Richard

+0

Danke Richard, habe meine Antwort aktualisiert – Adil

+0

autsch Richard, du hast mich dazu geschlagen. – Adam

0

Verwenden Sie entweder In diesem Beispiel müssen Sie sicherstellen, dass die TagName in String umgewandelt wird

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

Oder speichern Sie die XName als Schlüssel

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