如何使用Nokogiri :: XML :: Builder在元素名称中使用连字符创建XML?

我正在尝试使用Nokogiri构建XML文档。 一些元素中有连字符。 这是一个例子:

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

哪个产生:

  hello 

但是,当我尝试:

 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 

产生:

  hello 

如果你需要它们嵌套,那么你可以传递一个块

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

产生:

   hello  

Aaron Patterson的答案是正确的,适用于包含任何可能由Ruby解析器解释的字符的元素名称。

回答Angela的问题:将文本放置在以这种方式创建的元素中,您可以执行以下操作:

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