我有这个脚本,它是一个更大脚本的一部分。我有树形不同的XML文件,它们看起来有点不同,我需要某种类型的控制结构来更好地处理nil对象和xpath表达式
我现在拥有的脚本,输出零个对象:
require 'open-uri'
require 'rexml/document'
include REXML
@urls = Array.new()
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=186956355&strId=info.uh.kau.KTADY1&EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=184594606&strId=info.uh.gu.GS5&EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=185978100&strId=info.uh.su.ARO720&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 internationalella och globala frågor med。。。描述:对全球化的研究越来越多对我们理解当今世界和全球研究是一个独特的研究环境。
描述:
描述:
描述:Kursen behandlar identifieringen och beskrivningen av瑞典足球联赛。库尔森直到现代kliniska数据磁盘。
请参阅这篇关于在ruby中使用块时如何跳过条目的文章。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!在它上,它在执行该行时没有抛出错误。这意味着空的Descriptions是由空字符串引起的,而不是由nil对象引起的。