需要在Builder函数名中使用连字符

时间:2011-05-16 17:44:59

标签: ruby-on-rails ruby xml builder

我正在尝试使用Builder为我正在处理的项目构建一个xml文档。 xml有一个非常严格的结构,所以我不能改变它。 我遇到的问题是这个。我正在尝试将子项添加到节点"linking-phrase-list" 孩子的名字必须是"linking-phrase"。所以为了做到这一点,我会打电话:

test = Builder.new do |xml|
  xml.map {
    xml.send(:"linking-phrase-list") {
      xml.linking-phrase("label" => "edge1", "id" => "idedge1")
    }
  }
end

当然,ruby将此解释为(xml.linking)-phrase(),这完全不是我想要的。所以我需要知道是否有某种方法我可以说服ruby是一个函数调用而不是两个?那或告诉nokogiri我的意思是当我不使用该功能时。

2 个答案:

答案 0 :(得分:5)

使用构建器提供的tag!方法来实现此目的。

test = Builder.new do |xml|
  xml.map {
    xml.tag!("linking-phrase-list") {
      xml.tag!("linking-phrase", "label" => "edge1", "id" => "idedge1")
    }
  }
end

答案 1 :(得分:1)

因此,您在问题中得到了答案,请使用send方法:

require 'nokogiri'

test = Nokogiri::XML::Builder.new do |xml|
  xml.map {
    xml.send(:"linking-phrase-list") {
      xml.send(:"linking-phrase", "label" => "edge1", "id" => "idedge1")
    }
  }
end

puts test.to_xml

输出:

<?xml version="1.0"?>
<map>
  <linking-phrase-list>
    <linking-phrase label="edge1" id="idedge1"/>
  </linking-phrase-list>
</map>