2011-02-16 113 views
3

我使用Nokogiri來創建XML。我想有以下結構:使用Nokogiri創建名稱空間的XML元素

<content:encode>text</content> 

我曾嘗試這樣的代碼:

xml.content['encoded'] {xml.text "text"} 

,但它給了我一個錯誤。

如何正確寫入?一個類似的例子是Referencing declared namespaces

+1

幹得好告訴我們你嘗試過什麼樣的代碼。將來,您應該始終提供您收到的確切錯誤消息,而不僅僅是出現錯誤。 – Phrogz 2011-02-16 13:59:05

回答

10
  1. 你的例子沒有意義;你說你想要「編碼」,然後你試圖編寫「編碼」。

  2. 您的示例沒有意義,因爲它不是有效的XML。您有一個encode標籤,其名稱空間爲content,然後嘗試用content標記關閉它。您需要<content:encode>text</content:encode>或者您需要<encode:content>text</encode:content>(你想要什麼?)

  3. 你沒有按照你給的鏈接中的例子。如果你想與命名空間encoded一個content元素,那麼每個例子中,你應該寫:

    xml['encoded'].content{ xml.text "text" } 
    
  4. 然而,也按照例子,你必須聲明你想引用任何命名空間。所以這樣做:

    require 'nokogiri' 
    
    builder = Nokogiri::XML::Builder.new do |xml| 
        xml.root('xmlns:encoded' => 'bar') do 
        xml['encoded'].content{ xml.text "text" } 
        end 
    end 
    puts builder.to_xml 
    #=> <?xml version="1.0"?> 
    #=> <root xmlns:encoded="bar"> 
    #=> <encoded:content>text</encoded:content> 
    #=> </root> 
    

編輯:如果你真的只需要一個單一的元素,沒有根,通過引入nokogiri是矯枉過正。只要做到:

str = "Hello World" 
xml = "<encoded:content>#{str}</encoded:content>" 
puts xml 
#=> <encoded:content>Hello World</encoded:content> 

如果你確實需要使用引入nokogiri,但只希望在第一子根元素,這樣做:

xml_str = builder.doc.root.children.first.to_s 
#=> "<encoded:content>text</encoded:content>" 
+0

謝謝。但我們需要得到這樣的結構。 text .... - 額外的行,它們不是必需的 – Delaf 2011-02-19 01:49:37

相關問題