2013-07-09 6 views
0

Я просто хочу, чтобы получить последний ребенок узлы date и time в XML-файл, если узел alarm со значением true встречается:Конкретная узел в XML

XML выглядит так:

<USER> 
    <date>09.07.2013</date> 
    <time>08:28</time> 
    <alarm>true</alarm> 
</USER> 
<USER> 
    <date>09.07.2013</date> 
    <time>08:23</time> 
</USER> 
<USER> 
    <date>09.07.2013</date> 
    <time>08:17</time> 
    <alarm>true</alarm> 
</USER> 
<USER> 
    <date>09.07.2013</date> 
    <time>08:15</time> 
</USER> 

Мои код:

 string URL = "http://IP"; 
     HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; 
     request.Credentials = new NetworkCredential("Username", "PW"); 

     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      XmlReader xmlReader = XmlReader.Create(response.GetResponseStream()); 
      XDocument temp = XDocument.Load(xmlReader); 

      var date = temp.Element("USER").Descendants("date").Select(node => node.Value.ToString()).First(); 
      var time = temp.Element("USER").Descendants("time").Select(node => node.Value.ToString()).First(); 
     } 

Как я уже говорил, я просто хочу, чтобы получить date и time если

<alarm>true</alarm> 

было обнаружено.

+0

они не являются атрибутами, они являются дочерними узлами по вашему описанию fi le ... – ilansch

+0

@ilansch: Извините, что вы правы – user2428412

ответ

0

Более прямой альтернативой является использование более старой школы XPath, с XPathSelectElements найти последнего пользователя с alarm = true, например, так:

var lastUser = xdoc.XPathSelectElements("//USER[alarm='true']") 
        .LastOrDefault(); 
var lastUserDate = lastUser.Element("date").Value; 
var lastUserTime = lastUser.Element("time").Value; 

AFAIK это более или менее эквивалентно Linq:

var lastUser = xdoc.Descendants("USER") 
        .LastOrDefault(u => u.Element("alarm") != null 
            && u.Element("alarm").Value == "true"); 
var lastUserDate = lastUser.Element("date").Value; 
var lastUserTime = lastUser.Element("time").Value; 
2

Вы можете использовать следующий запрос, чтобы получить дату и время последнего пользователя элемента:

var lastUser = temp.Elements("User").LastOrDefault(); 
var date = (string)lastUser.Element("date"); 
var time = (string)lastUser.Element("time"); 
var isAlarm = (bool?)lastUser.Element("alarm"); 

UPDATE здесь запрос, который получит DateTime значения и значение сигнала тревоги от всех пользователей:

var users = from u in temp.Descendants("USER") 
      let time = (string)u.Element("time") 
      let date = (string)u.Element("date") 
      select new { 
       Date = DateTime.ParseExact(date + time, "MM.dd.yyyyHH:mm", null), 
       IsAlarm = (bool?)u.Element("alarm") ?? false 
      }; 

Вы можете получить дату последнего пользователя, пользователя с максимальной датой или фильтровать пользователей по значению тревоги. Например. получать время последнего сигнала тревоги:

var user = users.Where(u => u.IsAlarm).OrderBy(u => u.Date).LastOrDefault(); 
if (user != null) 
    date = user.Date; 
+0

Вы правы, но одна и та же проблема, код будет получен с или без true. Я просто хочу получить, если присутствует истина. – user2428412

+0

@ user2428412 добавлен код, чтобы проверить, установлен ли для параметра 'alarm' значение true. Кстати, ваш xml должен иметь один корневой узел –

+0

И теперь, если дочерний узел выглядит так, запущен? – user2428412

1

Ok,

var yourUser = temp.Root.Elements("USER").LastOrDefault(u => 
    u.Elements("alarm").Any(a => a.Value == true)); 

if (yourUser != null) 
{ 
    var dateTime = DateTime.ParseExact(
     (string)yourUser.Element("date") + (string)yourUser.Element("time"), 
     "dd.MM.yyyyHH:mm"); 
} 
+0

Кажется, это то, что я ищу. Попытаюсь поблагодарить вас за помощь – user2428412

+0

@ user2428412, сейчас я думаю. – Jodrell

0

Использование XElement вместо XDocument, так что вы можете обходить все элементы и атрибуты контента XML

XElement temp = XElement.Load(xmlReader);

После этого, просто так:

foreach (XElement user in temp.Elements("USER")) 
{ 
    var alarm = user.Element("alarm"); 

    if (alarm != null && alarm.Value == "true") 
    { 
     var date = user.Elements("date").Last().Value; 
     var time = user.Elements("time").Last().Value; 
    } 
} 
2

Вы можете получить последний узел с этот код:

Смежные вопросы