web-dev-qa-db-fra.com

Un moyen facile de convertir un dictionnaire <chaîne, chaîne> en xml et vice versa

Vous vous demandez s'il existe un moyen rapide, peut-être avec linq?, Pour convertir un Dictionary<string,string> dans un document XML. Et un moyen de reconvertir le xml en dictionnaire.

XML peut ressembler à:

<root>
      <key>value</key>
      <key2>value</key2>
</root>
38
mrblah

Dictionnaire à l'élément:

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

Élément au dictionnaire:

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);
}
84
LorenVS

Vous pouvez utiliser DataContractSerializer. Code ci-dessous.

    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();
            }
        }
    }
12
dcp

Utilisez simplement ceci pour XML dans le dictionnaire:

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

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

Le XML:

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

Vous passez simplement l'élément UserTypes à cette méthode et le tour est joué vous obtenez un dictionnaire avec les clés et les valeurs correspondantes et vice versa. Après avoir converti un dictionnaire, ajoutez l'élément à l'objet XDocument et enregistrez-le sur le disque.

6
Nikolay

A fait quelque chose comme ça pour un IDictionnaire

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

Cela a produit le XML suivant:

<root>
  <parent id="2">0</parent>
  <parent id="24">1</parent>
  <parent id="25">2</parent>
  <parent id="3">3</parent>
</root>
4
Vaibhav
  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();
2
Gaurav Madaan

Je cherchais la même chose avec une petite différence (chaîne, objet) et j'ai résolu comme ceci:

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

... pour un dictionnaire (imbriqué):

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

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

... en passant "root" comme firstNode j'obtiens:

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

Édité!

1
Bruno Montenegro