【问题标题】:Populate a dictionary<string, List<string>> from XML Document从 XML 文档填充字典<string, List<string>>
【发布时间】:2015-02-12 13:34:39
【问题描述】:

我想用以下 xml 填充 &lt;string, List&lt;string&gt;&gt; 类型的字典。

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

但它没有编译

【问题讨论】:

  • 这很好 - 但你尝试过什么?
  • 如果它没有编译,它可能会告诉你原因。 - 还有,"code"这个属性是从哪里来的?

标签: c# xml linq


【解决方案1】:

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

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

【讨论】:

  • 我无法使用 'x=>x.Descendants("symbol").Select(xy=>xy.Value).ToList())' 填充列表
【解决方案2】:

这是另一种选择:

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

【讨论】:

    【解决方案3】:

    假设你有一个如下的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);
    }
    

    我不知道这是否有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2020-10-28
      • 2021-10-08
      相关资源
      最近更新 更多