This page last modified: Sep 23 2010
keywords:nokogiri,builder,xml,example,code,working,child,parent,node,tree,root,doc,document description:Working code examples for adding a child node to a Nokogiri Builder object. title:Nokogiri Builder examples. Table of contents ----------------- Introduction Download the code examples Code fragments Introduction ------------ Nokogiri Builder is a class to create XML documents. However, it is lacking in documentation and examples so I worked out how to add a child element to an existing Builder tree. I found two cases where I needed to do this: 1) Looping and conditionals where the code involved either would not work in a Builder constructor, or where the code had to add elements that could not be known at the time Builder was first invoked 2) I wanted to add an external XML document to my Builder document. Download the code examples -------------------------- http://defindit.com/readme_files/nokogiri_examples.tar Code fragments -------------- This is not executable code. It is here for a quick overview. Download the tar file with the examples for executable code. The tar file includes several examples and a transcript recorded when I ran the examples so you'll see the expected output. # Code fragment 1: Use builder to create our main document. This gets # us ready for the next code fragments. @builder = Nokogiri::XML::Builder.new { wrap_it( 'WRAP' => "demo") { # The parent element is "wrap_it", thus method parent() # returns a Nokogiri::XML::Element that we can operate on later. @fs_parent = parent; } } # Code fragment 2: Given that we have somehow (with an accessor) put # the value of @fs_parent into fs_parent, this is the simple case of # adding a literal child element fs_parent.add_child("<test_ele>literal string element add</test_ele>") # Code fragment 2.1: The more complex case of adding an entire document as the child # element (child tree in this case). Again, assume that we used an # accessor to put the value of @fs_parent into the local variable # fs_parent fbuilder = Nokogiri::XML::Builder.new { new_element(:ID => "stuff", :USE => "directory") { inner_element(arg) } } fs_parent.add_child(fbuilder.doc.root) # Code fragment 3: Here we parse an external XML document, and add it # as the child. We're doing this directly in the Builder call, so # there's no saving of the parent node as in the examples above. @builder = Nokogiri::XML::Builder.new { mdWrap( 'MDTYPE' => "FITS") { xmlData { fits_xml = Nokogiri::XML(IO.read("noko_test.xml")) parent.add_child(fits_xml.root) } } }