如何更好地处理控制流和红宝石中的nil对象

时间:2012-03-03 22:12:07

标签: ruby xpath nokogiri rexml

我有这个脚本是一个更大的脚本的一部分。我有树不同的XML文件看起来彼此不同,我需要某种类型的控制结构来更好地处理nil-object和xpath表达式

我现在拥有的脚本输出nil对象:

require 'open-uri'
require 'rexml/document'
include REXML

@urls = Array.new()
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=186956355&amp;strId=info.uh.kau.KTADY1&amp;EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=184594606&amp;strId=info.uh.gu.GS5&amp;EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=185978100&amp;strId=info.uh.su.ARO720&amp;EMILVersion=1.1"

@urls.each do |url|
  doc = REXML::Document.new(open(url).read)
  doc.elements.each("/educationInfo/extensionInfo/nya:textualDescription/nya:textualDescriptionPhrase | /ns:educationInfo/ns:extensionInfo/gu:guInfoExtensions/gu:guSubject/gu:descriptions/gu:description | //*[name()='ct:text']"){
      |e| m = e.text 
      m.gsub!(/<.+?>/, "")
      puts "Description: " + m 
      puts ""   
    }
end

输出:

  

描述:bestrykning,kalandrering,tryckning,kemiteknik

     

描述:Vill du jobba med internationella ochglobalafrågormed...   描述:对全球化的研究正在变得越来越多   对于我们对当今世界和学校的了解非常重要   全球研究是一个独特的研究环境。

     

描述:

     

描述:

     

描述:Kursen behandlar identifieringen och beskrivningen av   sjukligaförändringarimeänskligipllett。 Kursen ger en   ämneshistoriskbakgrundochcllettförändringarsförhållanden   moderna kliniska数据diskuteras。

1 个答案:

答案 0 :(得分:1)

有关如何在ruby中使用块时跳过条目,请参阅this post。 doc.elements上的方法each()是用块调用的(你的代码是包含gsub和put调用)。 “next”关键字将允许您停止为当前元素执行块,然后继续执行下一个块。


doc.elements.each("/educationInfo/extensionInfo/nya:textualDescription/nya:textualDescriptionPhrase | /ns:educationInfo/ns:extensionInfo/gu:guInfoExtensions/gu:guSubject/gu:descriptions/gu:description | //*[name()='ct:text']"){
      |e| m = e.text 
      m.gsub!(//, "")

      next if m.empty?

      puts "Description: " + m 
      puts ""   
    }

我们知道使用“next”关键字时“m”是一个字符串(而不是nil),因为我们只是调用了gsub!在它上面,执行该行时没有抛出错误。这意味着空白描述是由空字符串引起的,而不是空符号。