【问题标题】:Populating a Dictionary with LINQ to XML使用 LINQ to XML 填充字典
【发布时间】:2015-08-27 12:27:55
【问题描述】:

我正在使用 LINQ to XML 解析 XML 文档并从该 XML 创建多个对象。其中一个对象有一个 Dictionary 作为属性,我需要从 XML 填充 Dictionary。但是,我不确定这样做所需的实际语法。

我知道我需要获取属性值并以某种方式将它们分配给字典中的键/值。

我该怎么做?

我有一个这样的模型类:

public class Statistics
{
    string Name { get; set; }
    public IDictionary<string, string> Information { get; set; }
}

像这样的XML:

  <section>
    <parameter name="this is a key" value="this is a value" />
    <parameter name="this is a key 2" value="this is a value 2" />
  </section>

在我的 LINQ 查询中,我需要从 namevalue 属性中设置键和值。

根据我的理解,我需要按照以下方式做一些事情:

.ToDictionary(x => x.name, x => x.value);

但我不确定如何将其应用于我的 LINQ 查询,以下代码是更大的 LINQ to XML 查询的一部分:

.Select(x => new Statistics
                {
                    Name = x.Attribute("name").Value,
                    Information = What goes here? .Select.Attributes? .ToDictionary(x => x.name, x => x.value);

【问题讨论】:

    标签: c# xml linq linq-to-xml linq-to-objects


    【解决方案1】:
    var dict = XDocument.Load(filename)
               .Descendants("parameter")
               .ToDictionary(p => p.Attribute("name").Value, p => p.Attribute("value").Value);
    

    【讨论】:

    • 唯一的问题是我已经调用了 XDocument.Load。有没有不加载两次的方法?
    • @user9993 XDocument.Load(filename) 返回 XElement 。所以您可以使用任何合适的 XElement,例如 p.Descendants("parameter").ToDictionary(.....)
    【解决方案2】:

    我认为这不是最好的解决方案。

    我会做这样的事情:

    .Select(x => new Statistics
                {
                    Name = x.Attribute("name").Value,
                    Information = GetParameterDictionnary(sectionNode)
    

    我会创建函数

    private Dictionary<string, string> GetParameterDictionnary(XmlNode sectionNode)
    {
        var dictionary = new Dictionary<string,string>();
        foreach(var child in sectionNode.Children)
        {
            dictionary.Add(child.Attribute("name"), child.Attribute("value"));
        }
        return dictionary;
    }
    

    【讨论】:

    • 如何从查询中获取 sectionNode?​​span>
    • 另一个答案似乎比我的部分解决方案更好地回答了这个问题(取决于部分示例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多