有没有办法从 XSD 生成 Ruby 类(甚至可能是 ActiveResource 类),以便它们包含一种将类序列化为对初始 XSD 有效的 xml 的方法?
我知道soap4r 有xsd2ruby,但似乎生成的ruby 类不能轻易地序列化为xml。
有没有办法从 XSD 生成 Ruby 类(甚至可能是 ActiveResource 类),以便它们包含一种将类序列化为对初始 XSD 有效的 xml 的方法?
我知道soap4r 有xsd2ruby,但似乎生成的ruby 类不能轻易地序列化为xml。
无耻的自我推销(希望这在stackoverflow上没问题)但我正在开发一个开源项目来做到这一点
它仍在进行中(请随意发送补丁),但最终目标是将 XSD 转换为/从 Ruby 类(现在可以)并将符合该 XSD 的 XML 转换为/从这些类的实例。
尽管前一段时间有人问过这个问题,但我遇到了一个解决方案,并认为它可能对未来的人们有所帮助。
我的需要是相似的。我有一个同事的 .xsd,想从中生成一个类文件。我希望我能够轻松地编组对象并将其传递到他的 RESTful 端点,在那里他的 Java 服务器将解组有效负载并在他身边动态构建对象,而无需额外的努力。
我找到的解决方案是soap4r
从https://github.com/rubyjedi/soap4r获取。我将 bin 目录中的两个 *.rb 文件设为可执行文件,然后运行:
bin/xsd2ruby.rb --xsd <source>.xsd --classdef <filename_prefix>
这会生成一个新文件,每个文件都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
为了完整起见,我用以下内容扩展了我的课程(这是一个“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_json
但我没有找到任何简单的到 XML 的转换。所以它归结为我自己的“to_xml”。
希望这可以帮助。
看来这可能会奏效。
需要'xsd/mapping' XSD::Mapping.obj2xml(xsdBasedObject)