obtener diccionario de xdocument c#

Tengo un xml como el siguiente:

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

Ahora quiero este xml en un diccionario. El siguiente es el código que estoy usando.

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

Ahora este código no funciona. Sé que hay un error tonto en alguna parte, ¿alguien puede ayudarme? Aquí hay una muestra de un requisito algo similar. convertir xdocument a IEnumerable >, pero tampoco puedo hacerlo funcionar.

Gracias,

preguntado el 22 de mayo de 12 a las 09:05

2 Respuestas

Estaba tratando de usar la misma instancia del objeto dataDictionary que arrojó la excepción de argumento. Ya se ha añadido un elemento con la misma clave. Para corregir esto, debe inicializar dataDictionary dentro del primero para cada bucle.

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

contestado el 22 de mayo de 12 a las 10:05

Puede agregar a una lista a medida que recorre:

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

Asumo aquí que desea una lista de objetos de Diccionario, con cada persona representada como un diccionario. Sin embargo, al volver a leer la pregunta, no estoy seguro de que eso sea lo que busca ...

contestado el 22 de mayo de 12 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.