Here's how to create a Dynarex schema from a shorthand schema represented by a 1-line string.

require 'builder'

def dynarex_schema(s)
ptrn = %r((\w+)\[?([^\]]+)?\]?\/(\w+)\(([^\)]+)\))
root_name, raw_summary, record_name, raw_fields = s.match(ptrn).captures
summary, fields = [raw_summary || '',raw_fields].map {|x| x.split(/,/).map &:strip}

xml = Builder::XmlMarkup.new( :target => buffer='', :indent => 2 )
xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"

xml.send root_name do
xml.summary do
summary.each do |item|
xml.send item
end
end
xml.records do
xml.send record_name do
fields.each do |field|
xml.send field
end
end
end
end

buffer
end

s = "contacts[title,description]/contact(name,age,dob)"
dynarex = dynarex_schema(s)
puts dynarex

output:




<br /> <description/> <br /> </summary> <br /> <records> <br /> <contact> <br /> <name/> <br /> <age/> <br /> <dob/> <br /> </contact> <br /> </records> <br /></contacts> <br /></pre> <br /> <br />*Creating a new Dynarex document* <br /><code> <br />require 'builder' <br /> <br />def dynarex(s) <br /> ptrn = %r((\w+)\[?([^\]]+)?\]?\/(\w+)\(([^\)]+)\)) <br /> root_name, raw_summary, record_name, raw_fields = s.match(ptrn).captures <br /> summary, fields = [raw_summary || '',raw_fields].map {|x| x.split(/,/).map &:strip} <br /> <br /> xml = Builder::XmlMarkup.new( target: buffer='', indent: 2 ) <br /> xml.instruct! :xml, version: "1.0", encoding: "UTF-8" <br /> <br /> xml.send root_name do <br /> xml.summary do <br /> summary.each do |item| <br /> xml.send item <br /> end <br /> xml.recordx_type 'dynarex' <br /> xml.format_mask fields.map {|x| "[!%s]" % x}.join(' ') <br /> xml.schema s <br /> end <br /> xml.records <br /> end <br /> <br /> buffer <br />end <br /> <br />s = "contacts[title,description]/contact(name,age,dob)" <br />dynarex = dynarex(s) <br />puts dynarex <br /></code> <br />output: <br /><pre> <br /><?xml version="1.0" encoding="UTF-8"?> <br /><contacts> <br /> <summary> <br /> <title/> <br /> <description/> <br /> <recordx_type>dynarex</recordx_type> <br /> <format_mask>[!name] [!age] [!dob]</format_mask> <br /> <schema>contacts[title,description]/contact(name,age,dob)</schema> <br /> </summary> <br /> <records/> <br /></contacts> <br /></pre><img src="http://feeds.feedburner.com/~r/dzone/snippets/~4/ys_emAYIy8k" height="1" width="1" /><p><strong>Read more:</strong> <a class="rssreadon" rel="external" title="Creating a Dynarex schema from a 1-line string" href="http://feeds.dzone.com/~r/dzone/snippets/~3/ys_emAYIy8k/11299" target="_blank">http://feeds.dzone.com/~r/dzone/snippets/~3/ys_emAYIy8k/11299</a></p> </div> </div> </div> </div> </div> </div> <div class="rt-grid-3"> <div id="rt-sidebar-a"> <div class="module-outline-1"> <div class="module-outline-2"> <div class="rt-block"> <div class="module-content"> <div class="in-module-content"> <script type="text/javascript"><!-- google_ad_client = "pub-1887577456589456"; /* 160x600, created 2/23/09 */ google_ad_slot = "1228644438"; google_ad_width = 160; google_ad_height = 600; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> </div> </div> </div> </div> </div> </div> <div class="clear"></div> </div> </div> </div> </div> </div> <div id="rt-copyright"> <div class="rt-container"> <div class="rt-grid-12 rt-alpha rt-omega"> <div class="clear"></div> <div class="rt-block"> CodersResource.com </div> </div> <div class="clear"></div> </div> </div> <div id="totop"> <div class="rt-grid-12 rt-alpha rt-omega"> <div class="clear"></div> <div class="rt-block"> <a href="#pageTop" id="gototop" class="no-click no-print">Scroll To Top</a> </div> </div> </div> <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> try { var pageTracker = _gat._getTracker("UA-7819541-1"); pageTracker._trackPageview(); } catch(err) {}</script> </body> </html>