在Ruby中,我从表示XML文档的文件中获取传入,但包含一些Ruby插值代码。这是一个例子:
<ns1: xmlns:ns1="http://example.com" attr="#{Time.now}">
现在,当我想评估字符串以解析Ruby引用时,我尝试了以下内容:
xs = '<ns1: xmlns:ns1="http://example.com" attr="#{Time.now}">'
eval("'" + xs + "'") #=> "<ns1: xmlns:ns1=\"http://example.com\" attr=\"\#{Time.now}\">"
eval %Q{"'" + #{xs} + "'"} # SyntaxError: (eval):1: syntax error, unexpected '<'
eval('"' + %Q{#{xs}} + '"') # SyntaxError: (eval):1: syntax error, unexpected tIDENTIFIER, expecting end-of-input
我不知道如何做到这一点。如何通过插值评估字符串,以便获得以下内容:
<ns1: xmlns:ns1="http://example.com" attr="2017-06-22 11:58:39 +0200">
答案 0 :(得分:2)
您不是在寻找字符串插值。你正在寻找一种模板语言。
字符串插值用于在字符串(或符号)文字中插入Ruby代码。你没有文字,你有一个对象的引用。字符串插值不起作用,它甚至不适用于这种情况。
你所拥有的是一种模板化语言,其语法恰好与Ruby的字符串插值语法相同。您需要该语言的实现;不幸的是,AFAIK还没有,所以你必须自己编写。编写一个非常简单,不是非常强大的模板引擎曾经是几年前在Ruby中流行的练习,所以我碰巧知道它只需要几分钟(和行)。 (尽管如此,面对不受信任的任意输入使其变得强大,安全和安全是完全不同的事情。)
如果您可以将输入格式更改为现有模板语言,那将是最简单的。在Ruby世界中,一种众所周知的模板语言是ERb,它实际上在标准库中有一个实现。还有Tenjin,Liquid,Ruty,Moustache,仅举几例。
答案 1 :(得分:2)
正如Jörg所建议的,如果您使用其中一种模板语言,您将获得更好的体验。我建议ERB,因为它是内置的。
xs = '<ns1: xmlns:ns1="http://example.com" attr="<%= Time.now %>">'
require 'erb'
ERB.new(xs).result(binding)
# => "<ns1: xmlns:ns1=\"http://example.com\" attr=\"2017-06-23 09:11:56 +0300\">"