使用Nokogiri创建带有命名空间的XML元素

Del*_*laf 4 ruby xml nokogiri

我使用Nokogiri来创建XML.我想要有以下结构:

<content:encode>text</content>
Run Code Online (Sandbox Code Playgroud)

我试过这段代码:

xml.content['encoded'] {xml.text "text"}
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误.

我该怎么写得正确?类似的示例在引用声明的命名空间中.

Phr*_*ogz 11

  1. 你的榜样没有意义; 你说你想要"编码",然后你尝试写"编码".

  2. 您的示例没有意义,因为它不是有效的XML.您有一个encode带有命名空间的开始标记content,然后尝试用content标记关闭它.你想要<content:encode>text</content:encode>或者你想要的<encode:content>text</encode:content>.(你想要哪一个?)

  3. 您没有按照您提供的链接中的示例进行操作.如果你想要一个content带有命名空间的元素encoded,那么按照你应该写的例子:

    xml['encoded'].content{ xml.text "text" }
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

编辑:如果你真的只需要一个没有root的单个元素,使用Nokogiri就是矫枉过正.做就是了:

str = "Hello World"
xml = "<encoded:content>#{str}</encoded:content>"
puts xml
#=> <encoded:content>Hello World</encoded:content>
Run Code Online (Sandbox Code Playgroud)

如果你真的需要使用Nokogiri,但只想要第一个子根元素,那么:

xml_str = builder.doc.root.children.first.to_s
#=> "<encoded:content>text</encoded:content>"
Run Code Online (Sandbox Code Playgroud)