2010-04-22 62 views
1

现在我知道如何在不转义值的情况下构建xml。 How to tell Builder to not to escape values如何使用转义值动态构建构建器

但是我需要动态构建标签。

期望的结果

<bank_info>Chase</bank_info> 

我有什么是

attr = 'bank_info' 
builder = Builder::XmlMarkup.new 
builder.attr { |x| x << 'bank_info' } # does not work 

我可以尝试使整个事情作为一个巨大的字符串和EVAL这一点。但评估并不安全。有没有更好的选择,我错过了。

回答

5

通常情况下,调用具有名称的方法的最简单方法是使用send__send__。在这里:

builder = Builder::XmlMarkup.new 
builder.__send__("bank_info") do # same effect as: builder.bank_info do 
    builder << "Chase" 
end 

BTW,有变异public_send,如果你想确保你是不是调用私有方法。只有在Ruby 1.9中,您可以使用require "backports"在Ruby 1.8中使用它。

注意:在这种情况下,send不起作用,正如@KandadaBoggu指出的那样,因为Builder覆盖了它;您必须使用__send__

+0

@marc您的代码将产生' bank_infoChase'为标记。它看起来像构建器重写所有的默认方法。我使用'tag!'方法解决了这个问题。 – 2010-04-22 19:21:39

+0

这应该教会我不要测试我的代码!我想知道'__send__'是否也被覆盖...反正,'tag!'是要走的路 – 2010-04-22 20:07:18

+0

对不起,我应该提到我希望我的数据被转义并标记!逃避它。这就是为什么在我的例子中我使用了<<。 – 2010-04-24 14:10:56

4

试试这个:

builder.tag! "bank_info", "Citi" 
+0

对不起,我应该提到,我希望我的数据被转义并标记!逃避它。这就是为什么在我的例子中我使用了<<。 – 2010-04-24 14:10:15