【问题标题】:Checking if Nokogiri object is nil before accessing text method在访问文本方法之前检查 Nokogiri 对象是否为零
【发布时间】:2016-09-23 16:14:36
【问题描述】:

我正在使用 Nokogiri 搜索从 API 收到的 XML。

fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
 [name()='serving']/*[name()='fiber']").first.text

但有时,响应中缺少子元素(例如纤维)。在这种情况下,Nokogiri 返回一个 nil 对象,而我的代码抛出了相应的异常(nil:NilClass 的未定义方法 `text'),因为我正在尝试访问一个 nil 对象的 'text' 方法。

在实际尝试调用其上的“文本”方法之前,检查子元素(例如纤维)是否存在的干净而快速的方法是什么?如果它不存在,我想将该值设置为 0。我也在为其他几个子元素(例如卡路里、碳水化合物等)执行此操作

【问题讨论】:

    标签: ruby-on-rails ruby nokogiri


    【解决方案1】:

    对于这些情况,您可以使用“尝试”

    fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
         [name()='serving']/*[name()='fiber']").first.try(:text)
    

    如果first为nil则返回nil,如果不是nil则调用text

    如果你需要一个默认值,以防万一它是 nil,你可以这样做

    fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
         [name()='serving']/*[name()='fiber']").first.try(:text) or 'default'
    

    【讨论】:

    • 完美运行。原来我不需要使用'default'选项,因为'nil + x = x',这就是我需要的结果。
    【解决方案2】:
    element = doc.xpath("/*[name()='food']/*[name()='servings']/*
    

    [name()='serving']/*[name()='fiber']")

    fiber = element.present? ? element.first.text : <handle other case here>
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2017-01-05
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      相关资源
      最近更新 更多