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