填充字典<string,list <string =“”>&gt;来自XML Document </string,>

时间:2015-02-12 13:34:40

标签: c# xml linq

我想使用以下xml填充<string, List<string>>类型的字典。

<?xml version="1.0" encoding="utf-8" ?>
<Currencies>
  <Currency name="USD">
    <symbol>$</symbol>
    <symbol>USD</symbol>
    <symbol>Dollar</symbol>
  </Currency>
  <Currency name="INR">
    <symbol>Rs.</symbol>
    <symbol>₹</symbol>
  </Currency>

在字典中

Dictionary dctCurrency<string,List<string>>;

这个货币名称应该是键,所有符号元素都应该在字符串列表中。

TIA

我尝试过以下代码,

var currencyXmlDocument = XDocument.Load(currencySymbolsDefinition);
var currencies = currencyXmlDocument.Root.DescendantNodes().OfType<XElement>();
currencySymbolsConfiguration = currencies.ToDictionary(l => l.Attribute("name").Value
    , l => l.Attribute("code").Value);

但它没有编译

3 个答案:

答案 0 :(得分:3)

试试这个。它没有检查就容易出错,但可以给你一个基本的想法。

var str = @"<Currencies>
  <Currency name='USD'>
    <symbol>$</symbol>
    <symbol>USD</symbol>
    <symbol>Dollar</symbol>
  </Currency>
  <Currency name='INR'>
    <symbol>Rs.</symbol>
    <symbol>₹</symbol>
  </Currency>
</Currencies>";
 var xx = XElement.Parse(str);

 var result = xx.Descendants("Currency")
    .ToDictionary(x => x.Attribute("name").Value, 
        x=>x.Descendants("symbol").Select(xy=>xy.Value).ToList());

答案 1 :(得分:1)

这是另一种选择:

Dictionary<string, List<string>> dctCurrency;
dctCurrency = (from c in doc.Root.Descendants("Currency")
               select new
               {
                  Key = c.Attribute("name").Value,
                  Value = c.Elements("symbol").Select(x => x.Value).ToList()
               }).ToDictionary(k => k.Key, v => v.Value);

或使用扩展方法:

dctCurrency = doc.Root.Descendants("Currency")
                      .Select(c => new
                      {
                         Key = c.Attribute("name").Value,
                         Value = c.Elements("symbol").Select(x => x.Value).ToList()
                      })
                      .ToDictionary(k => k.Key, v => v.Value);

答案 2 :(得分:-1)

假设你有一个xml如下:

<root>
      <key>value</key>
</root>

元素到字典将如下:

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

我不知道这是否有帮助。