Ответ 1
Здесь вы идете:
require 'nokogiri'
b = Nokogiri::XML::Builder.new do |xml|
xml.send(:"fooo-bar", "hello")
end
puts b.to_xml
Я пытаюсь создать 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
.
Как мне это сделать?
Здесь вы идете:
require 'nokogiri'
b = Nokogiri::XML::Builder.new do |xml|
xml.send(:"fooo-bar", "hello")
end
puts b.to_xml
Ответ 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>
Ответ Аарона Паттерсона правильный и будет работать для имен элементов, содержащих любой символ, который в противном случае может быть интерпретирован анализатором Ruby.
Ответ на вопрос Анжелы: поместить текст внутри созданного таким образом элемента, вы можете сделать что-то вроде этого:
require 'rubygems'
require 'nokogiri'
b = Nokogiri::XML::Builder.new do |xml|
xml.send(:'foo.bar') {
xml.text 'hello'
}
end
puts b.to_xml