如何使用Nokogiri :: XML :: Builder在元素名称中使用连字符创建XML?
我正在尝试使用Nokogiri构建XML文档。 一些元素中有连字符。 这是一个例子:
require "nokogiri" builder = Nokogiri::XML::Builder.new do |xml| xml.foo_bar "hello" end puts builder.to_xml
哪个产生:
hello
但是,当我尝试:
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
。
我该怎么做?
干得好:
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:"fooo-bar", "hello") end puts b.to_xml
Bart Vandendriessche的回答是有效的,但如果你只想要元素中的文本字段,那么有一个更简单的解决方案。
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:"foo-bar", 'hello') end puts b.to_xml
产生:
hello
如果你需要它们嵌套,那么你可以传递一个块
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:'foo-bar') { xml.send(:'bar-foo', 'hello') } end puts b.to_xml
产生:
hello
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