How to create an XML document with a namespaced root element with Nokogiri Builder

namespaces, nokogiri, ruby, xml

Solution

require 'rubygems'
require 'nokogiri'

puts Nokogiri::XML::Builder.new do |xml| 
  xml.root("xmlns:foo"=>"url") do
    xml.parent.namespace = xml.parent.namespace_definitions.find{|ns|ns.prefix=="foo"}
    xml['foo'].child
  end
end.to_xml

You cannot use `xml['foo']` before the namespace is defined, I.E. before you pass it as an argument to the root node, thus, the code above added the namespace after-the-fact to the root node.

Problem

I'm implementing an exporter for XML data that requires namespaces. I'm using Nokogiri's XML Builder (version 1.4.0) to do this, however, I can't get Nokogiri to create a root node with a namespace. This works: ``` Nokogiri::XML::Builder.new { |xml| xml.root('xmlns:foobar' => 'my-ns-url') }.to_xml <?xml version="1.0"?> <root xmlns:foobar="my-ns-url"/> ``` As does this: ``` Nokogiri::XML::Builder.new do |xml| xml.root('xmlns:foobar' => 'my-ns-url') { xml['foobar'].child } end.to_xml <?xml version="1.0"?> <root xmlns:foobar="my-ns-url"> <foobar:child/> </root> ``` However, I need something like `<foo:root>` and this doesn't work: ``` Nokogiri::XML::Builder.new { |xml| xml['foobar'].root('xmlns:foobar' => 'my-ns-url') }.to_xml NoMethodError: undefined method `namespace_definitions' for #<Nokogiri::XML::Document:0x11bfef8 name="document"> ``` Namespaces have to be defined before use, apparently, so there's no way to add one to the root node. I found "Define root node with a namespace?" on the Nokogiri mailing list, but it had no replies. Does anyone have a solution?

Original source