如何使用后代方法检查具有直接祖先的节点?

时间:2017-11-14 15:51:43

标签: c# linq-to-xml

如何获取其直接祖先是另一个节点的节点的值(使用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>

我希望节点<label>的所有值都具有直接祖先节点<sec>。即在这种情况下,该值应为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;

我得到2., Figure 1., Figure 2., 3.,为了达到我想要的目的,还需要添加其他条件吗?

1 个答案:

答案 0 :(得分: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;