我有一个加载到XElement中的XML文件。我想要计算既存在又满足某些条件的PollEvent子代的数量。我已经让代码计算了PollEvents的总数,但当我过滤这个列表时,我似乎无法调用.Where,我相信这是由于.Elements返回(扩展) IEnumerable<XElements>
。
这是到目前为止的代码-我已经将下一步要发生的事情放在了注释中。
public PollDayPoint LoadData(DateTime date)
{
PollDayPoint newDayPoint = new PollDayPoint();
newDayPoint.Date = date;
String filename = AlertLogging.CreateFileName(date);
XElement xmlDoc = XElement.Load(filename);
IEnumerable<XElement> sdis = xmlDoc.Elements("SDI");
IEnumerable<XElement> pollEvents = sdis.Elements("PollEvent");
//This works
int count = 0;
using (IEnumerator<XElement> enumerator = pollEvents.GetEnumerator())
while (enumerator.MoveNext())
count++;
newDayPoint.NumPolls = count;
//Now we want to get all poll events that match certain conditions
//Match those that have "Alert" children with attribute status="Sent"
//IEnumerable<XElement> alertEvents = sdis.Elements("PollEvent");
return newDayPoint;
}
下面一些示例XML
<PollEvents>
<SDI address="10.1.12.52">
<PollEvent time="2009_4_11 13:51:49">
<Alert errorCode="System.Net.WebException" errormessage="The remote server returned an error: (504) Gateway Timeout." status="Sent" handletime="2009_4_11 13:51:49" />
</PollEvent>
<PollEvent time="2009_4_11 14:06:47">
<Alert errorCode="System.Net.WebException" errormessage="The remote server returned an error: (504) Gateway Timeout." status="Supressed" handletime="2009_4_11 14:06:47" />
</PollEvent>
<PollEvent time="2009_4_11 14:21:47">
<Alert errorCode="System.Net.WebException" errormessage="The remote server returned an error: (504) Gateway Timeout." status="Supressed" handletime="2009_4_11 14:21:47" />
</PollEvent>
</SDI>
</PollEvents>
发布于 2009-11-05 20:00:52
首先,您的计算更简单,如下所示:
int count = pollEvents.Count();
但是,您应该能够通过extension method使Elements()
工作,并且您应该能够毫无问题地调用Where
,如下所示:
var alertEvents =
sdis.Elements("PollEvent")
.Where(x => x.Elements("Alert")
.Any(alert => (string) alert.Attribute("status") == "Sent")
);
如果这不起作用,你能发布你得到的错误吗?
发布于 2009-11-05 20:24:56
扩展Jon的答案,这将是他的解决方案的扩展方法:
namespace MyExtensions
{
public static class XElementsExtension
{
//Returns an IEnumerable of <PollEvent> having an "<Alert>" child element with attribute "status" == status
public static IEnumerable<XElement> FindElementsByStatus(this IEnumerable<XElement> list, string status)
{
return list.Elements("PollEvent")
.Where(x => x.Elements("Alert")
.Any(alert => (string)alert.Attribute("status") == status)
);
}
}
}
发布于 2009-11-05 20:01:17
使用linq查询表达式来处理以下内容:
var result = from el in XElement.Parse(data).Descendants("PollEvent")
where el.Element("Alert").Attribute("status").Value == "Sent"
select el;
newDayPoint.NumPolls = result.Count();
https://stackoverflow.com/questions/1680057
复制相似问题