2013-07-25 3 views
-1

Мой XML выглядит так:C# 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 выглядит следующим образом (срубы = истина):

<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

Я думаю @PLB пригвоздил :-) Как предложение: вы должны проверить Linq на XML, я люблю его! – Recipe

+0

@ Recipe Nope, Даниэль Хильграрт прибил его. Я был на несколько секунд медленнее. ;) – Leri

ответ

6

Почему вы используете First, если вы не хотите выбирать первый элемент? Вместо этого используйте Where.

var data = xml.Element("response") 
       .Descendants("sensor") 
       .Where(x => ((string)x.Element("log")) == "false") 
       .Elements("data") 
       .Select(x => x.Value) 
       .ToList(); 
+0

Спасибо. Я относительно новичок в программировании и не знал, что здесь можно достичь «где». Спасибо и хорошего дня – user2428412

0

Почему бы не использовать .Where вместо .First и вы должны получить массив обратно?

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(); 
Смежные вопросы