2015-08-27 2 views
0

Я использую LINQ to XML для анализа XML-документа и создания нескольких объектов из этого XML. Один из объектов имеет словарь как свойство, и мне нужно заполнить словарь из XML. Однако я не уверен в синтаксисе, который требуется для этого.Заполнение словаря LINQ to XML

Я знаю, что мне нужно получить значения атрибута и каким-то образом назначить им ключ/значение в словаре.

Как это сделать?

У меня есть класс модели, как это:

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 мне нужно, чтобы установить ключ и значение из атрибутов name и value.

Из моего понимания, что нужно сделать что-то вдоль линий:

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

Но я не уверен, как применить это на мой запрос LINQ, следующий код является частью большего LINQ для запроса XML :

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

ответ

3
var dict = XDocument.Load(filename) 
      .Descendants("parameter") 
      .ToDictionary(p => p.Attribute("name").Value, p => p.Attribute("value").Value); 
+0

Единственная проблема состоит в том, что я уже назвал XDocument.Load. Есть ли другой способ, не загружая его дважды? – user9993

+0

@ user9993 'XDocument.Load (имя_файла)' возвращает 'XElement'. Таким образом, вы можете использовать любой подходящий XElement, такой как 'p.Descendants (« parameter »). ToDictionary (.....)' – Eser

1

Я не думаю, что это самое лучшее решение.

Я хотел бы сделать что-то вроде этого:

.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; 
} 
+0

Как мне получить sectionNode из запроса? – user9993

+0

Я не знаю, у меня нет всего кода –

+0

Другой ответ, похоже, лучше всего отвечает на проблему, чем мое частное решение (полагающееся на частичный пример) –