Easy way to convert a Dictionary to xml and vice versa

前端 未结 6 1603
北海茫月
北海茫月 2020-11-30 22:13

Wondering if there is a fast way, maybe with linq?, to convert a Dictionary into a XML document. And a way to convert the xml back to a di

相关标签:
6条回答
  • 2020-11-30 22:52

    You can use DataContractSerializer. Code below.

        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();
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-30 23:00

    Dictionary to Element:

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

    Element to Dictionary:

    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);
    }
    
    0 讨论(0)
  • 2020-11-30 23:08

    Just use this for XML to Dictionary:

         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;
            }
    

    Dictionary to 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;
            }
    

    The XML:

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

    You just pass the element UserTypes to that method and voila you get a dictionary with the coresponding keys and values and vice versa. After converting a dictionary append the element to XDocument object and save it on the disk.

    0 讨论(0)
  • 2020-11-30 23:09

    I was looking for the same thing with a little difference(string, object) and I solved like this:

    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;
    }
    

    ...for a dictionary(nested):

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

    ...passing "root" as firstNode i get:

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

    Edited!

    0 讨论(0)
  • 2020-11-30 23:12

    Did something like this for an 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);
    }
    

    That produced the following XML:

    <root>
      <parent id="2">0</parent>
      <parent id="24">1</parent>
      <parent id="25">2</parent>
      <parent id="3">3</parent>
    </root>
    
    0 讨论(0)
  • 2020-11-30 23:16
      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 讨论(0)
提交回复
热议问题