2009-12-22 52 views
15

我正在嘗試使用Nokogiri構建XML文檔。一些元素在其中有連字符。這裏有一個例子:如何用元素名稱中的連字符使用Nokogiri :: XML :: Builder創建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

我該怎麼做?

回答

40

在這裏你去:

require 'nokogiri' 

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

puts b.to_xml 
+4

哪裏了招呼進來? xml.send(:「foo-bar」,「hello」)? – Angela 2010-05-31 02:10:26

+1

它在官方的Nokogiri文檔中有記載嗎?你能分享一個鏈接嗎? – yegor256 2014-08-06 14:33:04

+1

@ yegor256在這裏你去:http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Builder – bonh 2014-10-24 13:11:49

3

亞倫帕特森的答案是正確的,幷包含可通過其它方式使用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 
26

巴特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> 
相關問題