Hi,

I tried ri. My impression: Cool!

Dave Thomas <Dave / PragmaticProgrammer.com> wrote:
> To do that with the current scheme would require that every client
> have the Ruby xmlparser module installed, which in turn requires Jim
> Clark's expat library. This seems onerous!
> 
> So, I initially started hacking together yet another flat file
> representation of the data. I'd ship it with ri, and when you type
> 'ruby install.rb', the installer would read it and generate the
> marshaled classes. Then that little alarm bell started ringing that
> said "there has to be a better way". Unfortunately, the battery ran
> down before it got around to telling me what that better way is.
> 
> So, any ideas?

We have already used a very useful flat file representation
of the data: Ruby script :-)

If your problem is installing xmlparser.so, not using xmltree.rb,
how about a plan as follows?
  1. convert XML file into Ruby script that builds DOM tree.
  2. distribute the script, xmltree.rb and some scripts using
     DOM to generate the marshaled data.

I attach simple script coverting XML file to Ruby script.

# I refered to MoonWolf's rd2xml.rb. Thanks! > MoonWolf

TAKAHASHI Masayoshi (maki / inac.co.jp)



#!/usr/bin/env ruby -Ku require 'uconv' require 'xmlparser' require 'xmltree' require 'xmltreebuilder' require 'xmltreevisitor' class XML2DOMVisitor<XML::SimpleTree::Visitor def initialize end def visit_Document(grove, *rest) super end def visit_Element(element, *rest) ret = "Element.new(" ret += "'"+element.nodeName+"'," ret += "{" attrs = [] nn = element.attributes nn.each{|node| attrs << '"' + node.name + '" => "' + node.value + '"' } ret += attrs.join(",") ret += "},[" ret += element.children_accept(self, *rest).join(',').to_s ret += "])" ret end def visit_Text(text, *rest) ret = "Text.new('" ret += text.data.gsub("'","\\\\'") ret += "')" ret end def visit_CDATASection(text, *rest) # ignore. end def visit_Comment(comment, *rest) # ignore. end def visit_ProcessingInstruction(pi, *rest) # ignore. end end doc = XML::SimpleTreeBuilder.new.parse($<.read) print "#!/usr/bin/env ruby -Ku\n" print "require 'xmltree'\n" print "include XML\n" print "include XML::DOM\n" print "$domtree = Document.new(" print doc.accept(XML2DOMVisitor.new, []).to_s print ")\n"