从xdocument c#获取字典

时间:2012-05-22 08:57:12

标签: c# dictionary linq-to-xml xelement

我有一个像下面这样的xml:

<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>>的示例,但我也无法使其工作。

感谢,

2 个答案:

答案 0 :(得分: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; 
        } 

答案 1 :(得分: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对象列表,每个人都表示为字典。重读这个问题,我不确定那是你所追求的......