2012-09-21 4 views
0

가능한 중복은 :
In Ruby, can you perform string interpolation on data read from a file?외부 파일에서 문자열의 특정 부분을 변수로 정의 할 수 있습니까?

나는 몇 가지 '리'요소를 통해 루프를 필요

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

그런 다음, 모든 XPath의 때문에, 외부 파일에 있습니다 그러한 '요소'변수의 값은 다음과 같습니다.

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

요소 변수는 문자열로 읽히고 [# {i}]는 [1]과 같은 값으로 대체되지 않습니다. 외부 파일에있는 문자열의 특정 부분을 변수로 정의하는 방법이 있습니까?

답변

0

질문을 올바르게 이해하면 구조에 Ruby 문자열 보간을 수행 할 XPath 문자열과 같은 특정 필드가있는 JSON 형식의 외부 데이터 파일이 있습니다.

짧은 대답은 예, Kernel#eval을 사용하여 직접 할 수 있다는 것입니다. erb을 사용하는 등의 다른 옵션도 있습니다. 당신은 본질적으로 다른 소스에서 코드를 실행하기 때문에 위험을 내포하다 "평가"를 사용 물론

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 

, 그래서 당신이 취해야 많은주의 사항이 있습니다 : 단순한 "평가"경로를 사용하는 솔루션은 다음과 같을 수 안전을 보장합니다.

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?

+0

감사합니다, 나는 일시적으로 해결할 당신이 XPath는 항목에 보간을 제한 할 수 있도록 더 좋은 방법은 간단한 정규 표현식 교체하고 포함 할 수 JSON 파일에서 언급 한 구문과 유사한 구문을 사용하여 문제를 해결 한 다음 루프 내에서 GSUB를 사용하여 문제를 해결하십시오. # => "// ul [@ id = 'locations']/li [__ INDEX __]/a" : for i 1..5 Xpaths.getPath ("location", "elements") .gsub (__ INDEX__, "# {i}") end 내가 일을하면서 EVAL 및 ERB를 월요일에 조사하는 것이 더 깨끗한 방법 일 수 있습니다. 것들 ... 고맙습니다! – mickael

관련 문제