【问题标题】:linq help to exclude null itemslinq 帮助排除空项目
【发布时间】:2015-10-20 14:16:02
【问题描述】:

我有下面的 linq 表达式,它派生了网页上的所有电子邮件标签。但是,它似乎也正在捕获空锚缺少 href 属性

items 并抛出空引用异常错误:

{"值不能为空。\r\n参数名称:源"}

> var emailNodes =
> _htmlDocument.Value.DocumentNode.SelectNodes("//a[@href]")
>                           .Select(a => a.Attributes["href"].Value)
>                           .Where(href => href.StartsWith("mailto:")) // keep emails, skipp links
>                           .ToList();

是否有可用于 LINQ 的调整来彻底排除空值?

编辑:如前所述,当 html 缺少 href 时出现错误 全部一起。有没有办法在 LINQ 中处理这个问题?**

【问题讨论】:

  • 如果使用StartsWith,为什么要选择空项?
  • 你确定 a.Atrributes["href"] 不为空吗?我建议在从中获取 Value 之前进行空检查。在尝试访问 linq 语句中的值之前,您总是希望进行空检查
  • 您能否包含堆栈跟踪,以便我们准确查看该错误的来源?
  • 等等。如果href 为空,则StartsWith 将返回false。我猜你的问题出在其他地方。
  • 您已经选择了//a[@href],它应该排除没有 href 属性的任何内容。它不排除属性的空值,但给出的答案就是这样做!

标签: c# linq linq-to-xml html-agility-pack


【解决方案1】:

检查没有 href 的标签,然后在使用点运算符之前检查 null 或空的 href 字符串。

var emailNodes =
    _htmlDocument.Value.DocumentNode.SelectNodes("//a[@href]")
                 .Where(a => a.Attributes["href"] != null)
                 .Select(a => a.Attributes["href"].Value)
                 .Where(href => !String.IsNullOrEmpty(href) && href.StartsWith("mailto:")) // keep emails, skipp links
                 .ToList();

【讨论】:

  • 它是否也可以变得足够聪明以排除没有 href 属性的标签?我现在也收到之前被其他故障覆盖的这些项目的空错误?
  • 您应该能够在 SelectNodes 之后和 Select 之前添加另一层: .Where(a => a.Attributes["href"] != null) 这应该会阻止以下 select .Value 访问为空。
  • 查看我的编辑添加这一行:.Where(a => a.Attributes["href"] != null)。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多