Necesita usar un guión en el nombre de una función de Builder

Estoy tratando de usar Builder para crear un documento xml para el proyecto en el que estoy trabajando. El xml tiene una estructura muy estricta, así que no puedo cambiarlo. El problema con el que me encuentro es este. Estoy tratando de agregar un niño a un nodo "linking-phrase-list" El nombre del niño debe ser "linking-phrase". Entonces, para hacer esto, llamaría:

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

Por supuesto, entonces Ruby interpreta esto como (xml.linking)-phrase() que no es en absoluto lo que quiero. Entonces, necesito saber si hay alguna manera de convencer a ruby ​​de que es una llamada de función, no dos. Eso o decirle a nokogiri que me refiero a eso cuando no estoy usando esa función.

preguntado el 16 de mayo de 11 a las 17:05

2 Respuestas

Utiliza tag! método proporcionado por el constructor exactamente para este propósito.

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

contestado el 16 de mayo de 11 a las 22:05

Entonces, tienes la respuesta en tu pregunta, usa send método:

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

salida:

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

contestado el 16 de mayo de 11 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.