19

我正在尝试使用 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.

我该怎么做?

4

3 回答 3

45

干得好:

require 'nokogiri'

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

puts b.to_xml
于 2009-12-22T16:56:35.177 回答
29

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>
于 2010-09-10T13:21:43.940 回答
3

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

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

require 'rubygems'
require 'nokogiri'

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

puts b.to_xml
于 2010-09-10T10:11:28.427 回答