有没有办法从XSD生成Ruby类(甚至可能是ActiveResource类),以便它们包含一种将类序列化为xml对初始XSD有效的方法?
我知道soap4r有xsd2ruby,但似乎生成的ruby类不能轻易地序列化为xml。
答案 0 :(得分:6)
无耻的自我推销(希望这在stackoverflow上没问题)但是我正在开发一个开源项目来做that
它仍然是一项正在进行的工作(随意发送补丁),但最终目标是将XSD转换为Ruby类(现在它),并将符合XSD的XML转换为这些类的实例。
答案 1 :(得分:5)
标记,
虽然不久之前有人问过,但我遇到了一个解决方案,并认为它可能会对未来的人们有所帮助。
我的需求与此类似。我有一个同事的.xsd,想从中生成一个类文件。我希望我能够轻松地对对象进行编组并将其传递给他的RESTful端点,在那里他的Java服务器将解组有效负载并动态地在他身边构建对象而无需额外的努力。
我找到的解决方案是从https://github.com/rubyjedi/soap4r获取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”。
希望这有帮助。
答案 2 :(得分:3)
看起来这可能会奏效。
需要'xsd / mapping' XSD :: Mapping.obj2xml(xsdBasedObject)