2012-05-22 6 views
2

У меня есть XML как следующее:прибудет словарь из XDocument C#

<NewDataSet> 
<Person> 
    <FirstName>abc</FirstName> 
    <LastName>xyz</LastName> 
    <Address>12345abc</Address> 
</Person> 
<Person> 
    <FirstName>abcd</FirstName> 
    <LastName>pqr_xyz</LastName> 
    <Address>1111abc</Address> 
</Person> 
<Person> 
    <FirstName>abcde</FirstName> 
    <LastName>ghy_xyz</LastName> 
    <Address>98765abc</Address> 
</Person> 
</NewDataSet> 

Теперь я хочу этот XML в словарь. Ниже приведен код, который я использую.

string data = 
@"<NewDataSet><Person>..."; 
XDocument doc = XDocument.Parse(data); 
Dictionary<string, string> dataDictionary = new Dictionary<string, string>(); 
foreach (XElement elem in doc.Descendants("Person")) 
    { 
     var row = elem.Descendants(); 
     string str = elem.ToString(); 
     foreach (XElement element in row) 
     { 
      string keyName = element.Name.LocalName; 
      dataDictionary.Add(keyName, element.Value); 
     } 
     yield return dataDictionary; 
    } 

Этот код не работает. Я знаю, что где-то есть глупая ошибка, может ли кто-нибудь помочь мне? Вот пример несколько аналогичного требования convert xdocument to IEnumerable<Dictionary<string, object>>, но я не могу заставить его работать.

спасибо,

ответ

3

Вы пытались использовать тот же экземпляр объекта dataDictionary, который вызвал исключение аргумента. Элемент с тем же ключом уже добавлен. Чтобы исправить это, вам нужно инициализировать dataDictionary в первом для каждого цикла.

 Dictionary<string, string> dataDictionary = null; 

     foreach (XElement elem in doc.Descendants("Person")) 
     { 
      var row = elem.Descendants(); 
      string str = elem.ToString(); 

      dataDictionary = new Dictionary<string, string>(); 

      foreach (XElement element in row) 
      { 
       string keyName = element.Name.LocalName; 
       dataDictionary.Add(keyName, element.Value); 
      } 

      yield return dataDictionary; 
     } 
0

Вы могли бы добавить в список, как вы цикл через:

var list = new List<Dictionary<string, string>>(); 
foreach (XElement elem in doc.Descendants("Person")) 
{ 
    var dataDictionary = new Dictionary<string,string>(); 
    var row = elem.Descendants(); 
    foreach (XElement element in row) 
    { 
     string keyName = element.Name.LocalName; 
     dataDictionary.Add(keyName, element.Value); 
    } 
    list.Add(dataDictionary); 
} 
var enumDict = list.AsEnumerable(); 

Я предполагаю, что здесь, что вы хотите получить список объектов Dictionary, с каждым человеком, представленным в качестве словаря. Перечитывая вопрос, хотя, я не уверен, что это то, что вам нужно ...

+0

Спасибо, это сработало :) – nilarya