Как создать XML с помощью Nokogiri :: XML :: Builder с дефисом в имени элемента? - PullRequest
16 голосов
/ 22 декабря 2009

Я пытаюсь создать документ 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.

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

Ответы [ 3 ]

42 голосов
/ 22 декабря 2009

Вот, пожалуйста:

require 'nokogiri'

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

puts b.to_xml
27 голосов
/ 10 сентября 2010

Ответ Барта Вандендриссе работает, но есть более простое решение, если вам нужно только текстовое поле внутри элемента.

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 голосов
/ 10 сентября 2010

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

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

require 'rubygems'
require 'nokogiri'

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

puts b.to_xml
...