2009-03-17 9 views
2

triés un fichier XML similaire à ceci:j'ai converti xml dictionnaire

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <resource key="123">foo</resource> 
    <resource key="456">bar</resource> 
    <resource key="789">bar</resource> 

</data> 

je veux mettre cela dans un dictionnaire (triés) sous forme de paires de valeurs clés. i.e: 123: foo, 456: bar ... etc

les clés sont inconnues.

comment puis-je faire cela?

Répondre

5

Essayez ceci,

string s = "<data><resource key=\"123\">foo</resource><resource key=\"456\">bar</resource><resource key=\"789\">bar</resource></data>"; 
XmlDocument xml = new XmlDocument(); 
xml.LoadXml(s); 
XmlNodeList resources = xml.SelectNodes("data/resource"); 
SortedDictionary<string,string> dictionary = new SortedDictionary<string,string>(); 
foreach (XmlNode node in resources){ 
    dictionary.Add(node.Attributes["key"].Value, node.InnerText); 
} 
+0

+1 xpath loop est la solution 2.0 – annakata

+0

Ah, les grands esprits se ressemblent. Ma version est un peu plus concise, mais l'approche est la même. –

8

Cela ressemble à un emploi pour LINQ to Xml

static void Main(string[] args) 
    {    
     XDocument yourDoc = XDocument.Load("the.xml"); 
     var q = from c in yourDoc.Descendants("resource") 
       orderby (int) c.Attribute("key") 
       select c.Attribute("key").Value + ":" + c.Value; 

     foreach (string s in q) 
      Console.WriteLine(s);        
     Console.ReadLine(); 
    } 
+0

2008 en supposant que oui ... – annakata

0

je ferais cela avec la transformation XSLT. Avez-vous besoin de faire le travail avec C#? Si ce n'est pas le cas, vous pouvez simplement créer un document XSLT qui analyse toutes les balises de ressources et affiche la clé: valeur triée pour vous. Très facile à réaliser Est-ce une solution que vous voulez?

+0

Et que faites-vous avec la transformation de sortie? Vous devez toujours l'inclure dans un dictionnaire. – annakata

+0

Vous pouvez l'éditer comme vous le souhaitez. HTML, TXT, à vous. Droite? –

+0

mais aucune forme de sortie XSLT implémente IDictionary – annakata

6

Ceci est en fait plus facile sans utiliser LINQ et en utilisant simplement un XmlDocument:

SortedDictionary<string, string> myDict = new SortedDictionary<string, string>(); 
foreach (XmlElement e in myXmlDocument.SelectNodes("/data/resource")) 
{ 
    myDict.Add(e.GetAttribute("key"), e.Value); 
} 
2

Utilisez LINQ:

Chargez le document XDocument.Load ou XDocument.Parse:

var xml = XDocument.Load(...); 

à travers la séquence Itérer ordonnée:

var sequence = from e in xml.Root.Elements() 
       let key = (string)e.Attribute("key") 
       order by key 
       select new { 
       Key = key, 
       Value = (string)e 
       };