Generate Ruby Classes from XSD

前端 未结 3 713
说谎
说谎 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 <source>.xsd --classdef <filename_prefix>
    

    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.

    0 讨论(0)
  • 2021-02-03 11:20

    Shameless self promotion (hope this is okay on stackoverflow) but I'm working on an open source project to do just that

    Its still a work in progress (feel free to send patches) but the ultimate goal is to convert XSD to/from Ruby classes (which it does now) and convert XML conforming to that XSD to/from instances of those classes.

    0 讨论(0)
  • 2021-02-03 11:30

    It appears that this might work.

    require 'xsd/mapping' XSD::Mapping.obj2xml(xsdBasedObject)

    0 讨论(0)
提交回复
热议问题