2017-11-14 16 views
0

即時祖先が別のノード(descendantsメソッドを使用しています)、e.x.のノードの値を取得するにはどうすればよいですか。以下のxmlファイルのごく一部子孫メソッドを使用して直下祖先のノードをチェックする方法は?

<sec id="s2"> 
<label>2.</label> 
<title>THE MORPHOLOGY OF CHONDRAE TENDIANEAE OF ATRIOVENTRICULAR VALVES HEARTS NEWBORNS AND INFANTS</title> 
<p>According to the macroscopic</p> 
<fig id="F1"> 
    <label>Figure 1.</label> 
    <caption><p>Tendon string valvular heart baby infants. 1 - mastoid muscle, 2 - tendon strings.</p></caption> 
    <graphic xlink:href="00062_psisdg9066_90661R_page_2_1.jpg"/> 
</fig> 
<fig id="F2"> 
    <label>Figure 2.</label> 
    <caption><p>Tendon string valvular heart newborn baby. 1 - mastoid muscle, 2 - tendon strings.</p></caption> 
    <graphic xlink:href="00062_psisdg9066_90661R_page_2_2.jpg"/> 
</fig> 
</sec> 
<sec id="s3"> 
<label>3.</label> 
<title>EXPERIMENTAL RESULTS AND DISCUSSION</title> 
<p>Material studies provided three-sided and mitral valve that were taken from 8 hearts of stillborn children and four dead infants.</p> 
</sec> 

私は直接の祖先ノード<sec>を持つノード<label>のすべての値をしたいです。すなわち、この場合には値が、私は

XDocument doc=XDocument.Load(@"D:\test\sample.XML"); 
var x = from a in doc.Descendants("label") 
     where a.Ancestors("sec").Attributes("id").Any() 
     select a.Value; 

をすれば、私は2., Figure 1., Figure 2., 3.を取得2.3. でなければならず、他のどのような条件私は私が望むものを達成するために追加する必要がありますか?

答えて

1

Ancestors("sec")は、どれだけ深くネストされていても、直系の祖先ではないので、すべての祖先を見つけることができます。
最初の祖先だけを取得する必要があります。 Ancestors()はそれらをドキュメントの逆順で返すので、最初のものを得ることができます。

var x = from a in doc.Descendants("label") 
    let ancestor = a.Ancestors().First() 
    where ancestor.Name == "sec" && ancestor.Attributes("id").Any() 
    select a.Value; 
+0

ありがとうございました。ところで、この場合、 'x'がnull/emptyであるかどうかを調べるには' if(x == null){Console.WriteLine( "そのような値は見つかりません! } 'は動作していないようです。 – Bumba

+0

@Bumba' x'はnullにはなりませんが、空にすることができます。だからあなたは 'DefaultIfEmpty()'を使うことができます。 –

関連する問題