Нужно использовать дефис в имени функции Builder - PullRequest
3 голосов
/ 16 мая 2011

Я пытаюсь использовать 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 ]

5 голосов
/ 16 мая 2011

Используйте метод tag!, предоставленный строителем именно для этой цели.

test = Builder.new do |xml|
  xml.map {
    xml.tag!("linking-phrase-list") {
      xml.tag!("linking-phrase", "label" => "edge1", "id" => "idedge1")
    }
  }
end
1 голос
/ 16 мая 2011

Итак, у вас есть ответ на ваш вопрос, используйте 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>
...