From: TAKAHASHI Masayoshi Date: 2001-02-26T21:05:59+09:00 Subject: [ruby-talk:11582] Re: A design/implementation question Hi, I tried ri. My impression: Cool! Dave Thomas 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 "' + 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"