Madhu V Rao
Madhu V Rao

Reputation: 937

Create one XML file that joins many others

I am trying to create an XML using some list of XML's.

here is an example list of XML's

java.xml :

<JavaDetails>
   <SomeList> ... </SomeList>
   ....
</JavaDetails>

c.xml

<CDetails>
   <SomeList> ... </SomeList>
   ....
</CDetails>

I want to create a Programming.xml using the above XML's

it should look like:

<programming>
 <Java>
   <JavaDetails>
    <SomeList> ... </SomeList>
    ....
   </JavaDetails>
 </Java>
 <C>
  <CDetails>
    <SomeList> ... </SomeList>
   ....
  </CDetails>
 </C>
</programming>

I am currently looking into nokogiri to do the same as Performance is a major factor, What I am not sure is how to create nodes for the output XML. any code help in Ruby using Nokogiri is much appreciated.

Upvotes: 2

Views: 133

Answers (2)

Phrogz
Phrogz

Reputation: 303401

To create a new XML file with a specific root, it can be as simple as:

doc = Nokogiri.XML("<programming/>")

One way to add a child node to that document:

java = doc.root.add_child('<Java/>').first

To read in another XML file from disk and append it:

java_details = Nokogiri.XML( IO.read )
java << java_details.root

Thus, if you have an array of filenames and you want to construct wrapping elements from each based on the name:

require 'nokogiri'
files = %w[ java.xml c.xml ]
doc   = Nokogiri.XML('<programming/>')

files.each do |filename|
  wrap_name = File.basename(filename,'.*').capitalize
  wrapper   = doc.root.add_child("<#{wrap_name} />").first
  wrapper   << Nokogiri.XML(IO.read(filename)).root
end

puts doc

Alternatively, if you want to use the Builder interface of Nokogiri:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.programming do
    files.each do |filename|
      wrap_name = File.basename(filename,'.*').capitalize
      xml.send(wrap_name) do
        xml.parent << Nokogiri.XML(IO.read(filename)).root
      end
    end
  end
end

puts builder.to_xml

Upvotes: 2

alf
alf

Reputation: 18550

To install it:

gem install nokogiri

Here's the syntax:

require 'nokogiri'

builder = Nokogiri::XML::Builder.new do |xml|
  xml.programming {
    xml.Java {
      xml.JavaDetails {
        xml.SomeList 'List item'
      }
    }
  }
end

The result can be retrieved with to_xml:

builder.to_xml

HTH!

Upvotes: 0

Related Questions