2017-11-14 19 views
0

즉시 조상이 다른 노드 (descendants 방법 사용) 인 e.x 노드의 값을 얻으려면 어떻게해야합니까? 아래의 XML의 일부가 나는 즉시 조상 노드 <sec>이있는 노드 <label>의 모든 값을 원하는자손 메서드를 사용하여 직계 조상을 가진 노드를 확인하는 방법은 무엇입니까?

<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> 

파일입니다. 즉,이 경우 값은 2.이어야하며 3. 내가 할 경우 내가 다른 어떤 조건 내가 원하는 것을 달성하기 위해 2., Figure 1., Figure 2., 3. 추가 내가해야합니까 얻을

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; 

?

답변

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

감사합니다. BTW,이 경우'x '가 null/empty인지 확인하려면 어떻게해야합니까? if (x == null) {Console.WriteLine ("No such value found!"); }'작동하지 않는 것 같습니다. – Bumba

+0

@Bumba'x'는 null이 아니지만 비어있을 수 있습니다. 그래서 당신은'DefaultIfEmpty()'를 사용할 수 있습니다. –