我的XML看起来如此:
<sensor>
<data>26.7</data>
<data>54.53</data>
<log>false</log>
</sensor>
要检索列表中的数据字段,我使用:
List<string> list = xml.Root.Descendants("sensor").Elements("data").Select(element => element.Value).ToList();
效果很好。
有时XML看起来像这样(log = true):
<sensor>
<data>26.7</data>
<data>54.53</data>
<log>true</log>
</sensor>
我想忽略这些价值观。我怎样才能做到这一点?
我试过了:
var lastUser = xml.Element("response").Descendants("sensor")
.First(u => u.Element("data") != null
&& u.Element("log").Value == "false");
但我只能检索当然只有第一个值。
答案 0 :(得分:6)
如果您不想选择第一个元素,为什么要使用First
?请改用Where
。
var data = xml.Element("response")
.Descendants("sensor")
.Where(x => ((string)x.Element("log")) == "false")
.Elements("data")
.Select(x => x.Value)
.ToList();
答案 1 :(得分:0)
为什么不使用.Where
代替.First
而你应该回来一个阵列?
答案 2 :(得分:0)
将投射节点用于bool
或double
:
var data= xml.Element("response").Descendants("sensor")
.Where(s => (bool)s.Element("log"))
.Elements("data")
.Select(d => (double)d)
.ToList(); // produces List<double>
是的@Daniel是对的 - First
只返回符合条件的序列中的第一个元素。
还要考虑使用XPath
var data = xdoc.XPathSelectElements("response/sensor[log='true']/data")
.Select(d => (double)d)
.ToList();