将 Dictionary<string, string> 转换为 xml 的简单方法,反之亦然
Posted
技术标签:
【中文标题】将 Dictionary<string, string> 转换为 xml 的简单方法,反之亦然【英文标题】:Easy way to convert a Dictionary<string, string> to xml and vice versa 【发布时间】:2009-11-25 20:34:18 【问题描述】:想知道是否有一种快速的方法(可能使用 linq?)将 Dictionary<string,string>
转换为 XML 文档。以及一种将 xml 转换回字典的方法。
XML 可能如下所示:
<root>
<key>value</key>
<key2>value</key2>
</root>
【问题讨论】:
【参考方案1】:字典到元素:
Dictionary<string, string> dict = new Dictionary<string,string>();
XElement el = new XElement("root",
dict.Select(kv => new XElement(kv.Key, kv.Value)));
元素到字典:
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);
【讨论】:
你可以使用 ToDictionary... rootElement.Elements().ToDictionary(key => key.Name, val => val.Value); 嵌套的 XML 值怎么样?例如:“您可以使用 DataContractSerializer。代码如下。
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();
【讨论】:
【参考方案3】:只需将它用于 XML 到字典:
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;
字典到 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;
XML:
<root>
<UserTypes>
<Type key="Administrator" value="A"/>
<Type key="Affiliate" value="R" />
<Type key="Sales" value="S" />
</UserTypes>
</root>
您只需将元素 UserTypes 传递给该方法,瞧,您会得到一个包含相应键和值的字典,反之亦然。转换字典后,将元素附加到 XDocument 对象并将其保存在磁盘上。
【讨论】:
DictToXml() 中的小错误。这里是循环的更正版本。 [代码] foreach(键中的字符串键) XElement inner = new XElement(valuesName); inner.Add(new XAttribute("key", key)); inner.Add(new XAttribute("value", inputDict[key])); outElm.Add(inner); [/code]【参考方案4】:为 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);
生成了以下 XML:
<root>
<parent id="2">0</parent>
<parent id="24">1</parent>
<parent id="25">2</parent>
<parent id="3">3</parent>
</root>
【讨论】:
【参考方案5】: 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();
【讨论】:
我已经为 JsonConvert 使用了 NewtonSoft.Json 包 它会给一个xml格式的数据或json文件数据。【参考方案6】:我正在寻找相同的东西,但有一点不同(字符串,对象),我解决了这样的问题:
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;
...对于字典(嵌套):
var key2 = new Dictionary<string, object>
"key3", "value",
"key4", "value",
;
var key = new Dictionary<string, object>
"key", "value"
"key2", key1,
;
...传递“root”作为我得到的第一个节点:
<root>
<key>value</key>
<key2>
<key3>value</key3>
<key4>value</key4>
</key2>
</root>
已编辑!
【讨论】:
【参考方案7】:@LorenVS 已经回答了 Xml 的字典
但是我发现使用 Linq 的字典缺少答案 XML:
// this could be XElement.Parse("<object attr='attr1'>value</object>") but lets do a file read, for more variety.
var doc = new XmlDocument();
doc.Load(fileName);
//also lets read attribiute and value as it hasnt been done above aswell.
Dictionary<string, string> dict =
doc.DocumentElement.ChildNodes.OfType<XmlElement>()
.ToDictionary(o => o.GetAttribute("attr"), o => o.Value));
【讨论】:
以上是关于将 Dictionary<string, string> 转换为 xml 的简单方法,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
如何将 List<Dictionary<string, byte[]> 对象添加到 Dictionary<string, byte[]> [重复]
10815 - Andy's First Dictionary解答
无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“System.Collections.Generic.Dictionary`2[System.String,S
如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A