如何使用元素名中带有连字符的Nokogiri::XML::Builder创建XML?

如何使用元素名中带有连字符的Nokogiri::XML::Builder创建XML?,xml,ruby,nokogiri,Xml,Ruby,Nokogiri,我正在尝试使用Nokogiri构建一个XML文档。有些元素中有连字符。下面是一个例子: 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> 我得到: syntax error, unex

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

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>
我得到:

syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '('
  xml.foo-bar "hello"
现在我意识到这是因为连字符被解释为
foo减去bar

我该怎么做?

给你:

require 'nokogiri'

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

puts b.to_xml

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

Bart Vandendriesche的答案是可行的,但如果您只希望在元素中包含一个文本字段,则有一个更简单的解决方案

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>
<?xml version="1.0"?>
<foo-bar>
  <bar-foo>hello</bar-foo>
</foo-bar>
生成:

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

你好

你好从哪里来?send(:“foo-bar”,“hello”)?在Nokogiri的官方文档中它记录在哪里?你能分享一个链接吗?@yegor256给你:这里的聚会有点晚了,但是当语法不适合你的时候,“xx aaa”语法是制作符号的标准Ruby方法