XML中的特定节点

本文关键字:节点 XML | 更新日期: 2023-09-27 18:21:35

如果遇到值为true的节点alarm,我只想获取XML文件中的最后一个子节点datetime

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

正如我之前所说,如果,我只想检索datetime

<alarm>true</alarm>

遇到。

XML中的特定节点

您可以使用以下查询来获取最后一个用户元素的日期和时间:

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;
    }
}