2017-01-31 7 views
0

私は現在、プログラム設定のためにXMLファイルを読み込まなければならないプロジェクトに取り組んでいます。特定のXMLパラメータを読む

XMLは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<!-- Settings for Modul1 --> 
<root> 
<Program-Config> 
    <Parameter>Name</Parameter> 
    <Value>John</Value> 
</Program-Config> 

<Program-Config> 
    <Parameter>Device</Parameter> 
    <Value>TV</Value> 
</Program-Config> 
. 
. 
. 
</root> 

この構造は、このようなDataGridViewのを埋めるためにも使用されています

Parameter | Value 
__________|______ 
Name  | John 
Device | TV 

これが働いていると私はXMLに私が行った変更を保存することができますファイル。

しかし、私の問題は、xmlファイルの特定の要素を読み取る必要がありますが、まだうまく機能していないことです。

マイコード:

 string dir; 
     dir = Directory.GetCurrentDirectory() + "\\config.xml"; 

     XDocument xDoc = XDocument.Load(dir); 
     var xmlStr = File.ReadAllText(dir); 

     var str = XElement.Parse(xmlStr); 
     var result = str.Elements("Program-Config"). 
      Where(x => x.Element("Parameter").Value.Equals("Device")).ToList(); 


     for (int i = 0; i <= result.Count - 1; i++) 
     { 
      Console.WriteLine(result[i].Value); 
     } 

しかし、彼が何をコンソールに書き込みがある:DeviceTV。しかし、私は必要があります:テレビ

これは、プログラムの他の部分のための文字列/ intとして使用されます。

誰でも私を助けることができますか?

答えて

0

Valueプロパティは、その子ノードの連結テキストを返します。 result[i]によって返される要素はParameter要素ですが、その子要素はValue要素のみになります。

var value = (string) str.Elements("Program-Config") 
    .Where(x => (string) x.Element("Parameter") == "Device") 
    .Elements("Value") 
    .Single(); 

XDocument.Loadを実行してこれを放棄する理由は明確ではありません。あなたは少しあなたのクエリを微調整することにより、文書を使用することができます。

var value = (string) xDoc.Descendants("Program-Config") 
    .Where(x => (string) x.Element("Parameter") == "Device") 
    .Elements("Value") 
    .Single(); 

は、作業のデモのためにthis fiddleを参照してください。

+0

xDocument xDoc = XDocument.Load(dir)が冗長であり、私が試した別のアプローチの残存である場合もあります。 – SUM

+0

xDocで2番目のソリューションを使用しています。あなたは非常に頑張ります!小さなxmlファイルの場合、これは私が行きたい方法です。たぶん、私はそれを少し変更する必要があるので、私はすべてのパラメータのクエリをハードコードする必要はありませんより多くのパラメータを読み込むには大きなファイルを持っている。 – SUM