2009-12-22 11 views
15

Estoy intentando crear un documento XML utilizando Nokogiri. Algunos de los elementos tienen guiones en ellos. He aquí un ejemplo:¿Cómo creo XML utilizando Nokogiri :: XML :: Builder con un guión en el nombre del elemento?

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

puts builder.to_xml 

que produce:

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

Sin embargo, cuando intento:

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

me sale:

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

Ahora me doy cuenta de que esto es debido el guión se interpreta como foo MINUS bar.

¿Cómo debo hacer esto?

Respuesta

40

Aquí van: La respuesta de

require 'nokogiri' 

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

puts b.to_xml 
+4

dónde viene el hola vienen en ? xml.send (: "foo-bar", "hola")? – Angela

+1

¿Dónde está documentado en la documentación oficial de Nokogiri? ¿puedes compartir un enlace? – yegor256

+1

@ yegor256 aquí tienes: http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Builder – bonh

3

Aaron Patterson es correcta y va a trabajar para nombres de elementos que contienen cualquier carácter que de otra manera puede ser interpretado por el intérprete de Ruby.

Respondiendo a la pregunta de Angela: para colocar texto dentro de un elemento creado esta manera se puede hacer algo como esto: obras respuesta de

require 'rubygems' 
require 'nokogiri' 

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

puts b.to_xml 
26

Bart Vandendriessche pero no hay una solución más simple si solo deseas un campo de texto dentro de la elemento.

require 'nokogiri' 

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

puts b.to_xml 

Genera:

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

Si ellos para anidarse este caso es necesario se puede pasar un bloque

require 'nokogiri' 

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

puts b.to_xml 

Genera:

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