Una forma sencilla de convertir un diccionario a xml y viceversa

¿Se pregunta si hay una manera rápida, quizás con linq ?, de convertir un Dictionary en un documento XML. Y una forma de convertir el xml a un diccionario.

XML puede verse así:

  value value  

Diccionario a Elemento:

 Dictionary dict = new Dictionary(); XElement el = new XElement("root", dict.Select(kv => new XElement(kv.Key, kv.Value))); 

Elemento al diccionario:

 XElement rootElement = XElement.Parse("value"); Dictionary dict = new Dictionary(); foreach(var el in rootElement.Elements()) { dict.Add(el.Name.LocalName, el.Value); } 

Puede usar DataContractSerializer. Código a continuación.

  public static string SerializeDict() { IDictionary dict = new Dictionary(); dict["key"] = "value1"; dict["key2"] = "value2"; // serialize the dictionary DataContractSerializer serializer = new DataContractSerializer(dict.GetType()); using (StringWriter sw = new StringWriter()) { using (XmlTextWriter writer = new XmlTextWriter(sw)) { // add formatting so the XML is easy to read in the log writer.Formatting = Formatting.Indented; serializer.WriteObject(writer, dict); writer.Flush(); return sw.ToString(); } } } 

Solo use esto para XML a Dictionary:

  public static Dictionary XmlToDictionary (string key, string value, XElement baseElm) { Dictionary dict = new Dictionary(); foreach (XElement elm in baseElm.Elements()) { string dictKey = elm.Attribute(key).Value; string dictVal = elm.Attribute(value).Value; dict.Add(dictKey, dictVal); } return dict; } 

Diccionario a XML:

  public static XElement DictToXml (Dictionary inputDict, string elmName, string valuesName) { XElement outElm = new XElement(elmName); Dictionary.KeyCollection keys = inputDict.Keys; XElement inner = new XElement(valuesName); foreach (string key in keys) { inner.Add(new XAttribute("key", key)); inner.Add(new XAttribute("value", inputDict[key])); } outElm.Add(inner); return outElm; } 

El XML:

        

Simplemente transfiere el elemento UserTypes a ese método y obtendrá un diccionario con las claves y valores correspondientes y viceversa. Después de convertir un diccionario, agregue el elemento al objeto XDocument y guárdelo en el disco.

Hizo algo así para un IDictionary

 XElement root = new XElement("root"); foreach (var pair in _dict) { XElement cElement = new XElement("parent", pair.Value); cElement.SetAttributeValue("id", pair.Key); el.Add(cElement); } 

Eso produjo el siguiente XML:

  0 1 2 3  
  Dictionary myDictionary = new Dictionary(); myDictionary.Add("key", "value"); myDictionary.Add("key2", "value"); var myJson = JsonConvert.SerializeObject(myDictionary); var myXml = JsonConvert.DeserializeXNode(myJson.ToString(),"root"); Console.WriteLine(myXml.ToString()); Console.Read(); 

Estaba buscando lo mismo con una pequeña diferencia (cuerda, objeto) y lo resolví así:

 public static XElement ToXML(this Dictionary dic, string firstNode) { IList xElements = new List(); foreach (var item in dic) xElements.Add(new XElement(item.Key, GetXElement(item.Value))); XElement root = new XElement(firstNode, xElements.ToArray()); return root; } private static object GetXElement(object item) { if (item != null && item.GetType() == typeof(Dictionary)) { IList xElements = new List(); foreach (var item2 in item as Dictionary) xElements.Add(new XElement(item2.Key, GetXElement(item2.Value))); return xElements.ToArray(); } return item; } 

… para un diccionario (nested):

 var key2 = new Dictionary { {"key3", "value"}, {"key4", "value"}, }; var key = new Dictionary { {"key", "value"} {"key2", key1}, }; 

… pasando “root” como firstNode me sale:

  value  value value   

Editado!