在 Ruby 中插入包含双引号和冒号的 XML 字符串
Interpolating an XML string containing double quotes and colons in Ruby
在 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">
您不是在寻找字符串插值。您正在寻找一种模板语言。
字符串插值用于在字符串(或符号)文字中插入 Ruby 代码。你没有文字,你有一个对象的引用。字符串插值不起作用,它甚至不适用于这种情况。
您在这里看到的是一种模板语言,其语法恰好与 Ruby 的字符串插值语法相同。您需要该语言的实现;不幸的是,AFAIK 没有,所以你必须自己写。几年前,编写一个非常简单但不是很健壮的模板引擎曾经是 Ruby 中的一个流行练习,所以我碰巧知道它只需要几分钟(和几行)。 (不过,让它在面对不受信任的任意输入时变得健壮、安全和可靠是完全不同的事情。)
如果您可以将输入格式更改为现有的模板语言,那将是最简单的。 Ruby 世界中一种著名的模板语言是 ERb,它实际上在标准库中有一个实现。还有 Tenjin、Liquid、Ruty、Mustache 等等。
正如 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\">"
在 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">
您不是在寻找字符串插值。您正在寻找一种模板语言。
字符串插值用于在字符串(或符号)文字中插入 Ruby 代码。你没有文字,你有一个对象的引用。字符串插值不起作用,它甚至不适用于这种情况。
您在这里看到的是一种模板语言,其语法恰好与 Ruby 的字符串插值语法相同。您需要该语言的实现;不幸的是,AFAIK 没有,所以你必须自己写。几年前,编写一个非常简单但不是很健壮的模板引擎曾经是 Ruby 中的一个流行练习,所以我碰巧知道它只需要几分钟(和几行)。 (不过,让它在面对不受信任的任意输入时变得健壮、安全和可靠是完全不同的事情。)
如果您可以将输入格式更改为现有的模板语言,那将是最简单的。 Ruby 世界中一种著名的模板语言是 ERb,它实际上在标准库中有一个实现。还有 Tenjin、Liquid、Ruty、Mustache 等等。
正如 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\">"