2014-09-30 47 views
2

我使用Rails 2.1.0和Nokogiri 1.6.1。我想要的東西似乎很簡單。我想我的Rails REST API與這樣的元素返回XML:如何在Nokogiri中創建具有屬性和值的xml元素

<PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber> 

我試着寫類似:

xml = Nokogiri::NML::Builder.new do |xml| 
    xml.PeopleNumber(:unit => "NumberOfPeople") 2.235075 

的ActionController打完一個語法錯誤。

如果我嘗試重新寫這爲

xml = Nokogiri::NML::Builder.new do |xml| 
    xml.PeopleNumber(:unit => "NumberOfPeople") { 2.235075 } 

我得到類似

<PeopleNumber unit="NumberOfPeople" /> 

有誰知道的一種方式來獲得在引入nokogiri所需的行爲?

+0

請檢查您的代碼,並將其格式正確,以便我們提供幫助。 http://stackoverflow.com/help/formatting – Ernest 2014-09-30 10:13:54

+0

可能重複的[設置標籤屬性和添加純文本內容使用nokogiri生成器(紅寶石)標籤](http://stackoverflow.com/questions/16219343/set-tag -attribute-and-add-plain-text-content-to-the-tag-using-nokogiri-builder) – 2014-09-30 11:15:32

+0

謝謝@JustinKo。你的解決方案效果很好很容易,一旦你有解決方案! – user1327955 2014-10-01 05:40:06

回答

0

做到這一點簡單的方法:

require 'nokogiri' 

doc = Nokogiri::XML('<foo></foo>') 
doc.at('foo').add_child('<PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber>') 
puts doc.to_xml 
# >> <?xml version="1.0"?> 
# >> <foo> 
# >> <PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber> 
# >> </foo> 

的訣竅是add_child,這可能需要一個預定義的節點,或者由您要添加的XML字符串。從文檔:

添加node_or_tags作爲此節點的子節點。 node_or_tags可以是Nokogiri :: XML :: Node,a :: DocumentFragment,a :: NodeSet或包含標記的字符串。

「一個包含標記的字符串」是一個簡單的方法。

如果您需要爲unit參數不同的值,或標籤本身不同的值,可以插值那些到字符串:

foo = 'WheelSize' 
bar = '355/113' 

doc = Nokogiri::XML('<foo></foo>') 
doc.at('foo').add_child("<PeopleNumber unit='#{foo}'>#{bar}</PeopleNumber>") 
puts doc.to_xml 
# >> <?xml version="1.0"?> 
# >> <foo> 
# >> <PeopleNumber unit="WheelSize">355/113</PeopleNumber> 
# >> </foo> 

或者你也可以直接修改DOM和節點:

doc = Nokogiri::XML('<foo><PeopleNumber /></foo>') 
people_number = doc.at('PeopleNumber') 
people_number['unit'] = 'fred' 
people_number.content = 'ethel' 
puts doc.to_xml 
# >> <?xml version="1.0"?> 
# >> <foo> 
# >> <PeopleNumber unit="fred">ethel</PeopleNumber> 
# >> </foo> 

還有其他的方法可以做到這一點,但它是真的取決於你使用任何最適合你的頭。

+0

我想我也可以這樣做。但似乎更混亂?我不知道。我還想知道這是否是從API控制器創建響應的好方法。不是批評,只是@TheTinMan的一個問題。 – user1327955 2014-10-01 05:41:38

相關問題