2

私は次のような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;
    }

現在、このコードは機能していません。どこかにばかげた間違いがあることは知っていますが、誰か助けてくれませんか?これは、 xdocumentをIEnumerable <Dictionary <string、object >>に変換する、いくぶん似た要件のサンプルですが、どちらも機能させることができません。

ありがとう、

4

2 に答える 2

3

引数例外をスローしたdataDictionaryオブジェクトの同じインスタンスを使用しようとしていました。同じキーのアイテムはすでに追加されています。これを修正するには、最初のforeachループ内で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; 
        } 
于 2012-05-22T09:34:27.407 に答える
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();

ここでは、各人が辞書として表されている辞書オブジェクトのリストが必要であると想定しています。しかし、質問を読み直すと、それがあなたが求めているものかどうかはわかりません...

于 2012-05-22T09:04:18.707 に答える