在访问文本方法之前检查 Nokogiri 对象是否为 nil
Checking if Nokogiri object is nil before accessing text method
我正在使用 Nokogiri 搜索从 API 收到的 XML。
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.text
但有时,响应中会缺少子元素(例如 fiber)。在这种情况下,Nokogiri returns 一个 nil 对象,我的代码抛出相应的异常(nil:NilClass 的未定义方法 `text'),因为我试图访问 nil 的 'text' 方法对象。
在实际尝试调用 'text' 方法之前检查子元素(例如 fiber)是否存在的干净快速的方法是什么?如果它不存在,我想将该值设置为 0。我也在为其他几个子元素(例如卡路里、碳水化合物等)这样做
element = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']")
fiber = element.present? ? element.first.text : <handle other case here>
对于这些情况,您可以使用 "try"
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.try(:text)
它returns如果first为nil则为nil,如果不是nil则调用text
如果你需要一个默认值以防它为 nil,你可以这样做
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.try(:text) or 'default'
我正在使用 Nokogiri 搜索从 API 收到的 XML。
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.text
但有时,响应中会缺少子元素(例如 fiber)。在这种情况下,Nokogiri returns 一个 nil 对象,我的代码抛出相应的异常(nil:NilClass 的未定义方法 `text'),因为我试图访问 nil 的 'text' 方法对象。
在实际尝试调用 'text' 方法之前检查子元素(例如 fiber)是否存在的干净快速的方法是什么?如果它不存在,我想将该值设置为 0。我也在为其他几个子元素(例如卡路里、碳水化合物等)这样做
element = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']")
fiber = element.present? ? element.first.text : <handle other case here>
对于这些情况,您可以使用 "try"
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.try(:text)
它returns如果first为nil则为nil,如果不是nil则调用text
如果你需要一个默认值以防它为 nil,你可以这样做
fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
[name()='serving']/*[name()='fiber']").first.try(:text) or 'default'