2009-03-30 13 views
0

私のここでの要件は、ホスト名と一致するノード(たとえばmachine1)を取得することです。私は常に結果を返しません。問題が何であるか教えてください。LINQ to XMLの質問

事前にお手数をおかけしますようお願いいたします。

XDocument configXML = XDocument.Load("the below xml"); 

var q = from s in configXML.Descendants("lcsetting") 
    where ((string)s.Element("host") == hostName)       
    select s; 

実際のXML:あなたはlcsetting直下host要素を探している

<lcsettings> 
    <lcsetting env="prod"> 
    <hosts usagelogpath=""> 
     <host>machine1</host> 
     <host>machine2</host> 
     <host>machine3</host> 
    </hosts> 
    </lcsetting> 
    <lcsetting env="qa"> 
    <hosts usagelogpath=""> 
     <host>machine4</host> 
     <host>machine5</host> 
     <host>machine6</host> 
    </hosts> 
    </lcsetting> 
    <lcsetting env="test"> 
    <hosts usagelogpath=""> 
     <host>machine7</host> 
     <host>machine8</host> 
     <host>machine9</host> 
    </hosts> 
    </lcsetting> 
</lcsettings> 

答えて

4

- 常に階層内の2つの間にhosts要素がありますので、発生しません。 Elementsの代わりにElementも使用しています。つまり、正しい名前の最初の要素だけが返されます。

Elementの代わりにDescendantsを使用することもできますが、条件を変更する必要があります。何かのように:また

var q = from s in configXML.Descendants("lcsetting") 
     where s.Descendants("host").Any(host => host.Value == hostName) 
     select s; 

、あなたはあなたのクエリがhost要素を検索し、それぞれの場合に祖父母要素を取る作ることもできます。これは、ホスト要素のみlcsettingごとに一度起こるであろうと仮定し(

var q = from host in configXML.Descendants("host") 
     where host.Value == hostName 
     select host.Parent.Parent; 

。そうでない場合はDistinctへの呼び出しを追加できます)。

+0

ご返信ありがとうございます。また、クエリが結果を返さない場合は、デフォルトのlcsetting要素(「qa」など)を取得することは可能ですか? – Ganesha

1

"host"は "lcsetting"の子ではありません。

1

<ホスト>タグが、お客様の<ホスト>タグを含むlcsettingの真下にあるためです。 <ホスト>は、<のの即時の子ではありません。

このクエリは動作します:

var q = from s in configXML.Descendants("lcsetting").SelectMany(lcSetting => lcSetting.Descendants("host")) 
     where s.Name == "host" && s.Value == hostName 
     select s; 
1

あなたはlcsettingが、その後2つの段階その下にある要素のホストをチェックしようとして子孫を選択しています。 Element()関数は、1レベル深い子要素のみを参照します。これを次のように変更することをおすすめします。