Generate Ruby Classes from XSD

前端 未结 3 716
说谎
说谎 2021-02-03 10:48

Is there a way to generate Ruby classes (maybe even ActiveResource classes) from an XSD so that they contain a way to serialize the classes to xml valid for the initial XSD?

3条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-03 11:15

    Though this was asked a while ago, I came across a solution and thought it might help folks in the future.

    My need was similar. I have a .xsd from a colleague and would like to generate a class file from it. My hope is that I'll be able to easily marshall the object and pass it to his RESTful end-point, where his Java server will unmarshall the payload and dynamically build the object on his side with no additional effort.

    The solution I found was to get the soap4r from https://github.com/rubyjedi/soap4r. I made the two *.rb files in the bin directory executable and then ran:

    bin/xsd2ruby.rb --xsd .xsd --classdef 
    

    This generated a new file with each of the xsd:complexType implemented as a class. All other complex type were also generated with the correct inheritance relationships and all xsd:element was defined as an instance variable and a class initializer also defined.

    Running xsd2ruby.rb by itself yielded the options:

    ~/src/test/soap4r:bin/xsd2ruby.rb 
    Usage: bin/xsd2ruby.rb --xsd xsd_location [options]
      xsd_location: filename or URL
    
    Example:
      bin/xsd2ruby.rb --xsd myapp.xsd --classdef foo
    
    Options:
      --xsd xsd_location
      --classdef [filenameprefix]
      --mapping_registry
      --mapper
      --module_path [Module::Path::Name]
      --force
      --quiet
    

    For the sake of completeness, I extended my class with the following (this is a "Prospect" class):

    class Prospect
      include Enumerable
      def each(&block)
        self.instance_variables.collect{|v| (v.gsub /@/, '').to_sym }.each(&block)
      end
    end
    

    This let me use it as the body of an Net::HTTP::Post request.

    To the question of a free to_xml: I haven't found it. The ruby Object comes with a to_yaml and to_json out of the box, but I've not found any simple conversion to XML. So it came down to a roll my own "to_xml".

    Hope this helps.

提交回复
热议问题