从XSD生成Ruby类
有没有办法从XSD生成Ruby类(甚至可能是ActiveResource类),以便它们包含一种将类序列化为xml对初始XSD有效的方法?
我知道soap4r有xsd2ruby,但似乎生成的ruby类不能轻易地序列化为xml。
无耻的自我推销(希望这在stackoverflow上没问题)但我正在开发一个开源项目来做到这一点
它仍然是一项正在进行中的工作(随意发送补丁),但最终目标是将XSD转换为Ruby类(现在它),并将符合XSD的XML转换为这些类的实例。
标记,
虽然这是在不久前提出来的,但我遇到了一个解决方案,并认为它可能会对未来的人们有所帮助。
我的需求与此类似。 我有一个同事的.xsd,想从中生成一个类文件。 我希望我能够轻松地对对象进行编组并将其传递给他的RESTful端点,在那里他的Java服务器将解组有效负载并动态地在他身边构建对象而无需额外的努力。
我找到的解决方案是从https://github.com/rubyjedi/soap4r获取soap4r
。 我在bin目录中生成了两个* .rb文件,然后运行:
bin/xsd2ruby.rb --xsd .xsd --classdef
这生成了一个新文件,其中每个xsd:complexType
实现为一个类。 所有其他复杂类型也使用正确的inheritance关系生成,并且所有xsd:element
被定义为实例变量,并且还定义了类初始化程序。
xsd2ruby.rb
运行xsd2ruby.rb
会产生以下选项:
~/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
为了完整起见,我用以下内容扩展了我的课程(这是一个“Prospect”课程):
class Prospect include Enumerable def each(&block) self.instance_variables.collect{|v| (v.gsub /@/, '').to_sym }.each(&block) end end
这让我用它作为Net::HTTP::Post
请求的主体。
对于免费的to_xml
的问题:我还没有找到它。 ruby对象带有一个to_yaml
即用的to_yaml
和to_json
,但我没有找到任何简单的XML转换。 所以它归结为我自己的“to_xml”。
希望这可以帮助。
看起来这可能有效。
require’xdd / mapping’XSD :: Mapping.obj2xml(xsdBasedObject)