ruby rss模块没有阅读完整路径

时间:2014-06-05 16:32:49

标签: ruby xml rss

我正在下载一个发布为xml的rss文件,并使用rss扩展名保存它。 然后我使用rss模块将其作为rss文件读取。我遇到的问题如下:

  • 如果我使用隐式路径创建文件(page.rss),我只使用 使用rss解析函数处理它的文件名,一切 很好(downloaded_file ='page.rss')

  • 如果我明确地手动输入脚本的完整路径(downloaded_file =“E:/ Libraries / Documents / Android dev / page.rss”),一切正常。

  • 但如果我用以下方法“计算”绝对路径的值: downloaded_file = File.join(Dir.pwd,'page.rss'),则rss函数失败。变量的值显然是相同的(“E:/ Libraries / Documents / Android dev / page.rss”),但必须有一个看不见的差异。我希望能够使用'计算'绝对路径。我确信这个字符串被rss函数解释的方式有细微的差别。我该如何阐明它? 感谢您的任何建议。

这是我的剧本:

require 'rss'   
require 'open-uri'

url = 'http://tutorialspoint.com/android/sampleXML.xml'

downloaded_file = File.join(Dir.pwd, 'page.rss')                 # FAILS

puts "Path = #{downloaded_file}"#=> "E:/Libraries/Documents/Android dev/page.rss"
downloaded_file = 'page.rss'                                     # WORKS
#downloaded_file = "E:/Libraries/Documents/Android dev/page.rss" # WORKS
puts "Used path/filename: #{downloaded_file}"

File.open(downloaded_file, 'wb') do |file|  # Download url content into rss file
  file << open(url).read 
end 

rss = RSS::Parser.parse(downloaded_file, false)  # Read rss from downloaded_file                                 
puts "Title: #{rss.channel.title}"

1 个答案:

答案 0 :(得分:2)

新答案

好的,所以您的downloaded_file字符串已被标记为tainted,而RSS::Parser由于某种原因未能打开受污染的文件字符串(请参阅rss/parser.rb关于更多细节,请参阅l.105。解决方案是:在调用downloaded_file之前解开parse字符串,例如:

RSS::Parser.parse(downloaded_file.untaint, false)

或者只打开解析器的文件,例如:

RSS::Parser.parse(File.open(downloaded_file), false)

我以前从未遇到过这个问题,谢谢!我之前听说过物体污染,但我从来没有任何用处去研究它。这里有更多相关信息:What are tainted objects, and when should we untaint them?

以前的答案

Dir.pwd将根据您调用脚本的位置而改变。除非您从E:/Libraries/Documents/Android dev调用脚本,否则文件路径将关闭。

从脚本本身的位置构建文件路径会更好。为此,您可以添加:

ROOT = File.expand_path('..', __FILE__)
downloaded_file = File.join(ROOT, 'page.rss')
# or just downloaded_file = File.expand_path('../page.rss', __FILE__)