2009-12-22 4 views
15

J'essaye de construire un document XML en utilisant Nokogiri. Certains des éléments ont des traits d'union. Voici un exemple:Comment créer un XML en utilisant Nokogiri :: XML :: Builder avec un trait d'union dans le nom de l'élément?

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

puts builder.to_xml 

qui produit:

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

Cependant, lorsque je tente:

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

je reçois:

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

Maintenant, je sais que c'est parce que le trait d'union est interprété comme foo MINUS bar.

Comment est-ce que je devrais faire ceci?

Répondre

40

Ici, vous allez: de

require 'nokogiri' 

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

puts b.to_xml 
+4

où vient le bonjour venir en ? xml.send (: "foo-bar", "bonjour")? – Angela

+1

Où est-il documenté dans la documentation officielle de Nokogiri? pouvez-vous s'il vous plaît partager un lien? – yegor256

+1

@ yegor256 ici vous allez: http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Builder – bonh

3

Aaron Patterson La réponse est correcte et fonctionnera pour les noms d'éléments contenant un caractère qui peut être interprété autrement par l'analyseur Ruby.

Répondre à la question d'Angela: placer le texte dans un élément créé de cette façon que vous pouvez faire quelque chose comme ceci:

require 'rubygems' 
require 'nokogiri' 

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

puts b.to_xml 
26

œuvres de réponse de Bart Vandendriessche mais il y a une solution plus simple si vous voulez seulement un champ de texte dans la élément.

require 'nokogiri' 

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

puts b.to_xml 

Génère:

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

Si vous les devez être imbriqués, vous pouvez passer un bloc

require 'nokogiri' 

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

puts b.to_xml 

Génère:

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