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"
答
您与字符串“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
+1比我快2分钟,但你没有提到我的第二点(和斯蒂芬也)。 – 2010-05-11 19:58:44
谢谢。我知道这是一件小事。永远是。 哪种格式最适合使用:基于方法还是基于查询? – Arnej65 2010-05-11 19:58:51
@ Arnej65基于查询的编译器会将其翻译为方法,因此使用哪种方法更易于阅读。 – Stephan 2010-05-11 20:10:48