是否可以将外部文件中字符串的特定部分定义为变量?

时间:2012-09-21 16:14:13

标签: ruby xpath

  

可能重复:
  In Ruby, can you perform string interpolation on data read from a file?

我需要循环一些'li'元素:

for i in 1..5
  Xpaths.getPath("location","elements")      
end        

然后,所有xpath都在外部文件中,因此这些'elements'变量的值如下:

{ 
"location":
  {
  "elements"      :"//ul[@id='locations']/li[#{i}]/a"                                                           
  }
}              

元素变量读取为字符串,[#{i}]不会替换为[1]等值。有没有办法将外部文件中字符串的特定部分定义为变量?

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你有一些JSON格式的外部数据文件,其结构中有一些字段作为你希望执行Ruby字符串插值的XPath字符串。

简短的回答是,你可以直接使用,Kernel#eval。还有其他选项,例如使用erb。使用简单“eval”路线的解决方案可能如下所示:

xpaths = JSON.load(File.read('my-xpaths.json'))
(1..5).each do |i|
  xpath = eval(xpaths['location']['elements'].to_json)
  # => "//ul[@id='locations']/li[1]/a"
end

当然,使用“eval”充满了危险,因为您实际上是从其他来源执行代码,因此您必须采取许多预防措施来确保安全。更好的方法可能涉及进行简单的正则表达式替换,以便您可以约束XPath项上的插值:

xpaths['location']['elements'] # => "//ul[@id='locations']/li[__INDEX__]/a"
xpath = xpaths['location']['elements'].gsub(/__INDEX__/, i.to_s)
# => "//ul[@id='locations']/li[1]/a"

另请参阅此相关问题:In Ruby, can you perform string interpolation on data read from a file?