Quering XElements有子女的儿童属性

问题描述:

这里是XML大纲:Quering XElements有子女的儿童属性

<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(); 
} 

但我发现了倒没什么。我希望能够为每个“事情”选择属性“lang”等于一个值的“孩子”。

我也试过这个,它没有工作。

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

你正在检查的XAttribute对象是否等于字符串"e"
由于XAttribute对象永远不会等于一个字符串,因此它不起作用。

您需要检查XAttribute对象的Value,像这样:

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

+1比我快2分钟,但你没有提到我的第二点(和斯蒂芬也)。 – 2010-05-11 19:58:44

+0

谢谢。我知道这是一件小事。永远是。 哪种格式最适合使用:基于方法还是基于查询? – Arnej65 2010-05-11 19:58:51

+1

@ Arnej65基于查询的编译器会将其翻译为方法,因此使用哪种方法更易于阅读。 – Stephan 2010-05-11 20:10:48

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

试试这个:

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

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

由于Slaks说你检查的属性没有它的价值是 “E”。你也不需要select e.Value,因为“孩子”节点没有一个值他们有“记录”的孩子。

+0

的确如此。我将所有数据都记录在“记录”中,而不是节点。 – Arnej65 2010-05-11 20:04:27