我正在尝试使用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
。
我该怎么做?
答案 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