2010-09-06 8 views
1
string xml="< theme> 

<colors> 

<color> 
<code>1</code> 
<name>blue</name> 
<priority>5</priority> 
</color> 

<color> 
<code>2</code> 
<name>red</name> 
<priority>2</priority> 
</color> 

<color> 
<code>3</code> 
<name>green</name> 
<priority>7</priority> 
</color> 

</colors> 
</theme>" 

Je voudrais convertir cette chaîne de caractères XML en Liste de dictionnaires appelés, par exemple, 'couleurs'. Par exemple:Comment convertir une chaîne XML en une liste de dictionnaires?

List< Dictionary< string, string>> colors=new List< Dictionary< string, string>>(); 
colors=//Magic happens here 

colors[0]["name"] would return 'blue' 
colors[2]["priority"] would return '7' 

etc.

Merci.

Répondre

3

En supposant que vous utilisez LINQ to XML, qui est relativement facile:

var query = doc.Descendants("colors") 
       .Elements() // Get to each "color" element 
       .Select(outer => outer.Elements() 
            .ToDictionary(x => x.Name.LocalName, 
                x => x.Value)) 
       .ToList(); 

Laissez-moi savoir si tout cela n'a pas de sens pour vous.

EDIT: Oups, cela aurait été un List<Dictionary<XName, string>> avant. Fixe :)

EDIT: J'ai noté dans vos commentaires que vous utilisiez des noms complets. Essayez-le avec ces directives d'utilisation:

using System.Linq; 
using System.Xml.Linq; 

Ils sont requis pour trouver les méthodes d'extension.

+0

Merci Jon. Je suppose que doc est la suivante: System.Xml.Linq.XElement.Parse (xml) (le xml étant stocké dans une chaîne appelée 'xml') Correct? – Anthony

+0

Je reçois ce message d'erreur: "Un article avec la même clé a déjà été ajouté". Est-ce que ce qui suit est correct? System.Xml.Linq.XElement doc = System.Xml.Linq.XElement.Parse (xml); – Anthony

+0

@Anthony: Doh, désolé - légère faute de frappe. Corriger ... –

1

LINQ:

 var d = XDocument.Parse(x); 
     var l = new List<Dictionary<string, string>>(
      from color in d.Root.Element("colors").Elements("color") 
      select color.Elements().ToDictionary(k => k.Name.LocalName, k=>k.Value) 

      ); 

(où X est la chaîne)

+0

Une raison pour laquelle vous construisez la liste explicitement au lieu de simplement utiliser ToList? –

+0

@Jon Skeet: en fait, je ne suis pas sûr maintenant. Peut-être que je l'ai utilisé pour démontrer, que vous obtiendrez exactement nouveau 'List >'. – nothrow

Questions connexes