XML中的特定节点
本文关键字:节点 XML | 更新日期: 2023-09-27 18:21:35
如果遇到值为true
的节点alarm
,我只想获取XML文件中的最后一个子节点date
和time
:
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>
遇到。
您可以使用以下查询来获取最后一个用户元素的日期和时间:
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;
您可以使用以下代码获得最后一个节点:
var lastNode = doc.Root.Elements().Where(p => p.Name == "USER" && p.Elements().Any(o => o.Name == "alarm" && o.Value == "true")).Last();
好的,
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");
}
一个更直接的替代方案是使用更老式的XPath,使用XPathSelectElements来查找带有alarm = true
的最后一个USER,如下所示:
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;
使用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;
}
}