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

The*_*rus 17 ruby xml nokogiri

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

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

puts builder.to_xml
Run Code Online (Sandbox Code Playgroud)

哪个产生:

<?xml version="1.0"?>
<foo_bar>hello</foo_bar>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.foo-bar "hello"
end
Run Code Online (Sandbox Code Playgroud)

我明白了:

syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '('
  xml.foo-bar "hello"
Run Code Online (Sandbox Code Playgroud)

现在我意识到这是因为连字符被解释为foo MINUS bar.

我该怎么做?

小智 43

干得好:

require 'nokogiri'

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

puts b.to_xml
Run Code Online (Sandbox Code Playgroud)

  • 你好,哪里进来?xml.send(:"foo-bar","你好")? (4认同)

Viz*_*rai 27

Bart Vandendriessche的答案有效,但如果您只想在元素中使用文本字段,则可以使用更简单的解决方案.

require 'nokogiri'

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

puts b.to_xml
Run Code Online (Sandbox Code Playgroud)

产生:

<?xml version="1.0"?>
<foo-bar>hello</foo-bar>
Run Code Online (Sandbox Code Playgroud)

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

require 'nokogiri'

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

puts b.to_xml
Run Code Online (Sandbox Code Playgroud)

产生:

<?xml version="1.0"?>
<foo-bar>
  <bar-foo>hello</bar-foo>
</foo-bar>
Run Code Online (Sandbox Code Playgroud)