2011-05-16 52 views
3

我正在嘗試使用生成器爲我正在處理的項目生成一個xml文檔。 XML有一個非常嚴格的結構,所以我不能改變它。 我遇到的問題是這樣的。我試圖給一個節點添加一個孩子"linking-phrase-list" 孩子的名字必須是"linking-phrase"。因此,爲了做到這一點我會打電話:需要在生成器函數名稱中使用連字符

test = Builder.new do |xml| 
    xml.map { 
    xml.send(:"linking-phrase-list") { 
     xml.linking-phrase("label" => "edge1", "id" => "idedge1") 
    } 
    } 
end 

當然然後紅寶石將此解釋爲(xml.linking)-phrase()這是不是在所有我想要的東西。所以我需要知道是否有某種方式可以說服ruby,這是一個函數調用不是兩個?這或告訴nokogiri,我的意思是,當我不使用該功能。

回答

5

使用構建器提供的tag!方法來完成此目的。

test = Builder.new do |xml| 
    xml.map { 
    xml.tag!("linking-phrase-list") { 
     xml.tag!("linking-phrase", "label" => "edge1", "id" => "idedge1") 
    } 
    } 
end 
1

所以,你有你的問題的答案,使用send方法:

require 'nokogiri' 

test = Nokogiri::XML::Builder.new do |xml| 
    xml.map { 
    xml.send(:"linking-phrase-list") { 
     xml.send(:"linking-phrase", "label" => "edge1", "id" => "idedge1") 
    } 
    } 
end 

puts test.to_xml 

輸出:

<?xml version="1.0"?> 
<map> 
    <linking-phrase-list> 
    <linking-phrase label="edge1" id="idedge1"/> 
    </linking-phrase-list> 
</map> 
相關問題