2009-03-17 19 views
2

Ich habe eine XML-Datei wie folgt aus:konvertieren xml sortiert Wörterbuch

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

</data> 

Ich möchte diese in ein Wörterbuch setzen (sortiert) als Schlüsselwert-Paare. : 123: foo, 456: bar ... etc

die Schlüssel sind unbekannt.

Wie kann ich das tun?

Antwort

5

die Sie interessieren,

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-Schleife ist die 2.0-Lösung – annakata

+0

Ah, tolle Köpfe denken gleich. Meine Version ist ein wenig übersichtlicher, aber der Ansatz ist der gleiche. –

8

Das sieht wie ein Job für Linq

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 unter der Annahme, ja ... – annakata

0

XML Ich würde diese Transformation mit XSLT tun. Müssen Sie den Job mit C# erledigen? Wenn nicht, können Sie einfach ein XSLT-Dokument erstellen, das alle Ressourcen-Tags analysiert und den Schlüsselwert ausgibt. Sehr einfach durchgeführt. Ist das eine Lösung, die Sie wollen?

+0

Und was tun Sie mit dem Ausgang verwandeln? Sie müssen das immer noch in ein Wörterbuch einbauen. – annakata

+0

Sie können es wie gewünscht ausgeben. HTML, TXT, bis zu dir. Recht? –

+0

, aber keine Form der XSLT-Ausgabe implementiert IDictionary – annakata

6

Das tatsächlich einfacher ist Linq ohne und nur ein XmlDocument mit:

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

Verwenden LINQ:

Legen Sie das Dokument XDocument.Load oder XDocument.Parse:

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

Iterate durch die geordnete Folge:

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