查询具有子属性的子元素

时间:2010-05-11 19:50:34

标签: c# linq-to-xml

以下是XML大纲:

<Root> 
  <Thing att="11">    
    <Child lang="e">  
       <record></record>
       <record></record>
       <record></record>  
   </Child >
   <Child lang="f">  
       <record></record>  
       <record></record>                
       <record></record>
   </Child > 
 </Thing> 
</Root>

我有以下内容:

TextReader reader = new StreamReader(Assembly.GetExecutingAssembly()
                 .GetManifestResourceStream(FileName));

   var data = XElement.Load(reader);
foreach (XElement single in Data.Elements())
 {
      // english records
      var EnglishSet = (from e in single.Elements("Child")
         where e.Attribute("lang").Equals("e")
        select e.Value).FirstOrDefault();
}

但我什么都没回来。我希望能够为每个“Thing”选择“Child”,其中属性“lang”等于一个值。

我也试过这个,但是没有用。

var FrenchSet = single.Elements("Child")
.Where(y => y.Attribute("lang").Equals("f"))
.Select(x => x.Value).FirstOrDefault();

3 个答案:

答案 0 :(得分:2)

您正在检查XAttribute对象是否等于字符串"e" 由于XAttribute对象永远不等于字符串,因此不起作用。

您需要检查XAttribute对象的Value,如下所示:

where y => y.Attribute("lang").Value == "e"

答案 1 :(得分:1)

您正在将属性对象与字符串“e”进行比较,而不是attrbute对象的值。您还返回节点的值而不是节点的值。由于该值为空,因此您只需获取空字符串。

请改为尝试:

var EnglishSet = (from e in single.Elements("Child")
                  where e.Attribute("lang").Value == "e"
                  select e).FirstOrDefault();

答案 2 :(得分:1)

var EnglishSet = (from e in single.Elements("Child")
         where e.Attribute("lang").Value.Equals("e")
        select e).FirstOrDefault();

正如Slaks所说,你正在检查属性不是它的值是“e”。您也不需要select e.Value因为“子”节点没有他们“记录”孩子的值。