Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML中的特定节点_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# XML中的特定节点

C# XML中的特定节点,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,如果遇到值为true的节点报警,我只想在XML文件中获取最后一个子节点date和time: XML看起来是这样的: <USER> <date>09.07.2013</date> <time>08:28</time> <alarm>true</alarm> </USER> <USER> <date>09.07.2013</date>

如果遇到值为
true
的节点
报警
,我只想在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>
正如我之前所说,我只想检索
日期
时间
如果

<alarm>true</alarm>
true

遇到。

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

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

这里的更新是一个查询,它将从所有用户处获取
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 lastUser = temp.Elements("User").LastOrDefault();
var date = (string)lastUser.Element("date");
var time = (string)lastUser.Element("time");
var isAlarm = (bool?)lastUser.Element("alarm");

这里的更新是一个查询,它将从所有用户处获取
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;


一个更直接的替代方法是使用更多的老式XPath,使用
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;

一个更直接的替代方法是使用更多的老式XPath,使用
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;

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

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

您可以使用以下代码获取最后一个节点:

var lastNode = doc.Root.Elements().Where(p => p.Name == "USER" && p.Elements().Any(o => o.Name == "alarm" && o.Value == "true")).Last();

您可以使用以下代码获取最后一个节点:

var lastNode = doc.Root.Elements().Where(p => p.Name == "USER" && p.Elements().Any(o => o.Name == "alarm" && o.Value == "true")).Last();

它们不是属性,根据您对文件的描述它们是子节点…@ilansch:抱歉,您对它们不是属性,根据您对文件的描述它们是子节点…@ilansch:抱歉,您对,您对,但同样的问题,代码将在有或没有true的情况下检索。我只想检索是否存在报警真。@user2428412添加了代码以检查
报警是否设置为真。顺便说一句,您的xml应该有一个根节点,现在如果子节点看起来是这样触发的?@user2428412在您的xml中,报警节点有
true
值。你能具体说明你到底拥有什么以及你想要得到什么吗?报警等于
true
?是的最后一个用户元素的日期时间。。但是有一个关于什么是真正的报警节点的nda:/你是对的,但同样的问题是,代码将在有或没有true的情况下检索。我只想检索是否存在报警真。@user2428412添加了代码以检查
报警是否设置为真。顺便说一句,您的xml应该有一个根节点,现在如果子节点看起来是这样触发的?@user2428412在您的xml中,报警节点有
true
值。你能具体说明你到底拥有什么以及你想要得到什么吗?报警等于
true
?是的最后一个用户元素的日期时间。。但是有一个真正的报警节点的nda:/它似乎是我要找的。我要试试谢谢你的帮助这似乎是我要找的。我去试试谢谢你的帮助