当前位置:  开发笔记 > 后端 > 正文

从XSD生成Ruby类

如何解决《从XSD生成Ruby类》经验,为你挑选了2个好方法。

有没有办法从XSD生成Ruby类(甚至可能是ActiveResource类),以便它们包含一种将类序列化为xml对初始XSD有效的方法?

我知道soap4r有xsd2ruby,但似乎生成的ruby类不能轻易地序列化为xml.



1> 小智..:

无耻的自我推销(希望这在stackoverflow上没问题),但我正在开发一个开源项目来做到这一点

它仍然是一个正在进行中的工作(随意发送补丁),但最终目标是将XSD转换为Ruby类(现在它),并将符合XSD的XML转换为这些类的实例.



2> Peter Degen-..:

标记,

虽然这是在不久前提出的,但我遇到了一个解决方案,并认为它可能会对未来的人们有所帮助.

我的需求与此类似.我有一个同事的.xsd,想从中生成一个类文件.我希望我能够轻松地对对象进行编组并将其传递给他的RESTful端点,在那里他的Java服务器将解组有效负载并动态地在他身边构建对象而无需额外的努力.

我发现的解决方案是soap4r从https://github.com/rubyjedi/soap4r获取.我在bin目录中生成了两个*.rb文件,然后运行:

bin/xsd2ruby.rb --xsd .xsd --classdef 

这会生成一个新文件,每个文件都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:我还没有找到它.红宝石对象带有一个to_yamlto_json开箱即用,但我还没有发现任何简单的转换为XML.所以它归结为我自己的"to_xml".

希望这可以帮助.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有