Как создать XML с помощью Nokogiri:: XML:: Builder с дефисом в имени элемента?

Я пытаюсь создать XML-документ с помощью Nokogiri. Некоторые элементы имеют в них дефисы. Вот пример:

require "nokogiri"
builder = Nokogiri::XML::Builder.new do |xml|
  xml.foo_bar "hello"
end

puts builder.to_xml

Что производит:

<?xml version="1.0"?>
<foo_bar>hello</foo_bar>

Однако, когда я пытаюсь:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.foo-bar "hello"
end

Я получаю:

syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '('
  xml.foo-bar "hello"

Теперь я понимаю, что это потому, что дефис интерпретируется как foo MINUS bar.

Как мне это сделать?

Ответы

Ответ 1

Здесь вы идете:

require 'nokogiri'

b = Nokogiri::XML::Builder.new do |xml|
  xml.send(:"fooo-bar", "hello")
end

puts b.to_xml

Ответ 2

Ответ Bart Vandendriessche работает, но есть более простое решение, если вы хотите только текстовое поле внутри элемента.

require 'nokogiri'

b = Nokogiri::XML::Builder.new do |xml|
  xml.send(:"foo-bar", 'hello')
end

puts b.to_xml

Формирует:

<?xml version="1.0"?>
<foo-bar>hello</foo-bar>

Если вам нужно, чтобы они были вложенными, вы можете передать блок

require 'nokogiri'

b = Nokogiri::XML::Builder.new do |xml|
  xml.send(:'foo-bar') {
    xml.send(:'bar-foo', 'hello')
  }
end

puts b.to_xml

Формирует:

<?xml version="1.0"?>
<foo-bar>
  <bar-foo>hello</bar-foo>
</foo-bar>

Ответ 3

Ответ Аарона Паттерсона правильный и будет работать для имен элементов, содержащих любой символ, который в противном случае может быть интерпретирован анализатором Ruby.

Ответ на вопрос Анжелы: поместить текст внутри созданного таким образом элемента, вы можете сделать что-то вроде этого:

require 'rubygems'
require 'nokogiri'

b = Nokogiri::XML::Builder.new do |xml|
  xml.send(:'foo.bar') {
    xml.text 'hello'
  }
end

puts b.to_xml