2016-09-27 6 views
0

私はlinqを使用して非常に単純なXMLファイルを読み込もうとしています。私は子ノードを介してループを使用してそれを行う方法を知っていますが、私はlinqを学ぼうとしています。とにかく、ファイルがあります:単純なXMLファイルを読む

<firstElement> 
    <Setting Name="appDataPath" Value="some\\path" /> 
    <Setting Name="appConfigFileName" Value="somename.xml" /> 
    <Setting Name="appConfigFilePath" Value="some\\path" /> 
</firstElement> 

と設定属性を取得したいと思います。私はこのコードを持っています:

//Load xml 
XDocument xdoc = XDocument.Load(fullyQualifiedPath); 

var settings = from item in xdoc.Descendants("firstElement") 
    select new 
    { 
     name = item.Attribute("Name").Value, 
     val = item.Attribute("Value").Value 
    }; 

    // create a dictionary 
    Dictionary<string, string> settingsDictionary = 
         new Dictionary<string, string>(); 

    //Loop through results 
    foreach (var setting in settings) 
    { 
     settingsDictionary.Add(setting.name, setting.val); 
    } 

    xdoc.Save(fullyQualifiedPath); 

何らかの理由で、クエリの後に設定がnullです。何か不足していますか?のみの設定ノードを取得するために

+2

「eStack」とは何ですか? –

+0

'xdoc.Save(fullyQualifiedPath);はあなたの問題と関係がありますか?保存後にディスク上のxml文書で空白になっていますが、それは問題ですか?この行を削除しないと、問題に混乱が生じます。また、 'Descendants(" eStack ")'という部分がありますが、断片には 'eStack'ノードはありません。 – Igor

+0

これを試してください: 'from item in xdoc.Descendants(" Setting ")' –

答えて

2

は書く:

from item in xdoc.Descendants("Setting")

+0

ありがとうAntonio!それはうまくいった。 – cbutler

1

あなたはeStackという名前の要素を持っていません。これを代わりに試してみてください...

var settingsDictionary = xdoc.Descendants("Setting") 
          .ToDictionary(x => (string)x.Attribute("Name"), 
              x => (string)x.Attribute("Value") 
              ); 
+0

Matthewありがとう、これも動作します。 eStackは最初の要素の名前です。私はちょうど私の実際のコードから質問をするためにホールダーを置くことに変わる時に誤りを作りました。 – cbutler

+0

その場合、 'eStack'要素を選択した後に' .Descendants() 'を呼び出すことになります –