【问题标题】:How do handle control flow better and nil objects in ruby如何在 ruby​​ 中更好地处理控制流和 nil 对象
【发布时间】:2012-03-03 22:12:06
【问题描述】:

我有这个脚本,它是一个更大的脚本的一部分。我有树不同的 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 och globala frågor med... 描述:对全球化的研究越来越多 对我们了解当今世界和学校很重要 全球研究是一个独特的研究环境。

说明:

说明:

描述: Kursen behandlar identifieringen och beskrivningen av sjukliga förändringar 我 mänskliga 骷髅。库森格恩 ämneshistorisk bakgrund och skelettförändringars förhållanden till 现代诊所数据磁盘。

【问题讨论】:

  • 提示:puts "Description: " + m 最好写成puts "Description: #{m}",IMO。此外,puts "" 仅相当于 puts。您也可以只使用foo = [] 而不是foo = Array.new(有关更多信息,请参阅this question)。

标签: ruby xpath nokogiri rexml


【解决方案1】:

请参阅this post,了解如何在 ruby​​ 中使用块时跳过条目。 doc.elements 上的方法 each() 正在使用块调用(这是您包含 gsub 和 puts 调用的代码)。 “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!在它上面,执行该行时没有抛出错误。这意味着空白的描述是由空字符串引起的,而不是 nil 对象。

【讨论】:

  • 太棒了,我需要保留正则表达式,因为它会从 XML 文件中删除(不要打印)所有 html 标记。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 2013-07-18
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多