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

时间:2009-12-22 16:01:24

标签: 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>

然而,当我尝试:

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

我该怎么做?

3 个答案:

答案 0 :(得分:41)

你走了:

require 'nokogiri'

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

puts b.to_xml

答案 1 :(得分:27)

Bart Vandendriessche的回答是有效的,但如果您只想在元素中使用文本字段,那么有一个更简单的解决方案。

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>

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

require 'nokogiri'

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

puts b.to_xml

生成:

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

答案 2 :(得分:3)

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