2011-02-16 157 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

相关问题