require 'rexml/document'
class PolyrexSchema
include REXML
def initialize(s)
@doc = Document.new
node = Element.new 'root'
@doc.add node
s.scan(/\w+\[[^\]]*\]|\w+/).each do |x|
b1, b2 = x.split('[')
if b2 then
node = append_node node, b1 do |summary|
b2.scan(/\w+(?=[,\]])/).each {|x| summary.add Element.new x}
end
else
node = append_node node, x
end
end
end
def to_s
@doc.to_s
end
private
def append_node(node, name)
new_node = Element.new name
summary = Element.new 'summary'
yield(summary) if block_given?
new_node.add summary
records = Element.new 'records'
new_node.add records
node.add new_node
records
end
end
puts Document.write PolyrexSchema.new('q[n,x1,x2]/b1[y,y2]/c[n]').to_s
# see listing 1.
puts Document.write PolyrexSchema.new('q[n,x1,x2],b1[y,y2],c,g').to_s
# see listing 2.
Read more: http://feeds.dzone.com/~r/dzone/snippets/~3/V4KFYEDTAIk/11259