C#XML提取

时间:2013-07-25 06:46:33

标签: c# xml linq-to-xml

我的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");

但我只能检索当然只有第一个值。

3 个答案:

答案 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)

将投射节点用于booldouble

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