首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XElement.Elements()扩展方法?

XElement.Elements()扩展方法?
EN

Stack Overflow用户
提问于 2009-11-05 19:47:49
回答 3查看 5.2K关注 0票数 0

我有一个加载到XElement中的XML文件。我想要计算既存在又满足某些条件的PollEvent子代的数量。我已经让代码计算了PollEvents的总数,但当我过滤这个列表时,我似乎无法调用.Where,我相信这是由于.Elements返回(扩展) IEnumerable<XElements>

这是到目前为止的代码-我已经将下一步要发生的事情放在了注释中。

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
<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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-05 20:00:52

首先,您的计算更简单,如下所示:

代码语言:javascript
运行
复制
int count = pollEvents.Count();

但是,您应该能够通过extension method使Elements()工作,并且您应该能够毫无问题地调用Where,如下所示:

代码语言:javascript
运行
复制
var alertEvents = 
   sdis.Elements("PollEvent")
       .Where(x => x.Elements("Alert")
                    .Any(alert => (string) alert.Attribute("status") == "Sent")
             );

如果这不起作用,你能发布你得到的错误吗?

票数 3
EN

Stack Overflow用户

发布于 2009-11-05 20:24:56

扩展Jon的答案,这将是他的解决方案的扩展方法:

代码语言:javascript
运行
复制
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)
                             );
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-11-05 20:01:17

使用linq查询表达式来处理以下内容:

代码语言:javascript
运行
复制
var result = from el in XElement.Parse(data).Descendants("PollEvent")
             where el.Element("Alert").Attribute("status").Value == "Sent"
             select el;


newDayPoint.NumPolls = result.Count();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1680057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档