2009-11-25 19 views

Respuesta

73

Diccionario de Elemento:

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

elemento de diccionario:

XElement rootElement = XElement.Parse("<root><key>value</key></root>"); 
Dictionary<string, string> dict = new Dictionary<string, string>(); 
foreach(var el in rootElement.Elements()) 
{ 
    dict.Add(el.Name.LocalName, el.Value); 
} 
+18

puede usar ToDictionary ... * rootElement.Elements(). ToDictionary (clave => clave.Nombre, val => val.Valor); * –

+0

¿Qué ocurre con los valores XML anidados? Por ejemplo: " valor 1 valor2" –

10

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

public static string SerializeDict() 
    { 
     IDictionary<string, string> dict = new Dictionary<string, string>(); 
     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(); 
      } 
     } 
    } 
4

hizo algo como esto 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); 
} 

que produjo el siguiente código XML:

<root> 
    <parent id="2">0</parent> 
    <parent id="24">1</parent> 
    <parent id="25">2</parent> 
    <parent id="3">3</parent> 
</root> 
6

sólo tiene que utilizar esto para XML en Diccionario:

 public static Dictionary<string, string> XmlToDictionary 
             (string key, string value, XElement baseElm) 
     { 
      Dictionary<string, string> dict = new Dictionary<string, string>(); 

      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<string, string> inputDict, string elmName, string valuesName) 
     { 

      XElement outElm = new XElement(elmName); 

      Dictionary<string, string>.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:

<root> 
    <UserTypes> 
    <Type key="Administrator" value="A"/> 
    <Type key="Affiliate" value="R" /> 
    <Type key="Sales" value="S" /> 
    </UserTypes> 
</root> 

Usted sólo tiene que pasar los elementos UserTypes a ese método y listo se obtiene un diccionario con las claves y valores coresponding y viceversa. Después de convertir un diccionario, agregue el elemento al objeto XDocument y guárdelo en el disco.

+0

pequeño error en DictToXml(). Aquí una versión corregida para el ciclo. [código] foreach (clave de cadena en claves) { XElement inner = new XElement (valuesName); inner.Add (nuevo XAttribute ("clave", clave)); inner.Add (nuevo XAttribute ("valor", inputDict [clave])); outElm.Agregar (interno); } [/ code] –

2
Dictionary<string, string> myDictionary = new Dictionary<string, string>(); 
    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(); 
+0

He usado el paquete NewtonSoft.Json para JsonConvert –

+0

¿Qué le dará datos con formato xml o datos del archivo json? –

1

que estaba buscando lo mismo con una pequeña diferencia (cadena, objeto) y lo solucioné así:

public static XElement ToXML(this Dictionary<string, object> dic, string firstNode) 
{ 
    IList<XElement> xElements = new List<XElement>(); 

    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<string, object>)) 
    { 
     IList<XElement> xElements = new List<XElement>(); 
     foreach (var item2 in item as Dictionary<string, object>) 
      xElements.Add(new XElement(item2.Key, GetXElement(item2.Value))); 

     return xElements.ToArray(); 
    } 

    return item; 
} 

... de un diccionario (anidada):

var key2 = new Dictionary<string, object> 
       { 
        {"key3", "value"}, 
        {"key4", "value"}, 
       }; 

var key = new Dictionary<string, object> 
       { 
        {"key", "value"} 
        {"key2", key1}, 
       }; 

... pasando "root" como firstNode me sale:

<root> 
    <key>value</key> 
    <key2> 
     <key3>value</key3> 
     <key4>value</key4> 
    </key2> 
</root> 

¡Editado!

Cuestiones relacionadas