11

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

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

4

3 回答 3

7

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

它仍在进行中(请随意发送补丁),但最终目标是将 XSD 转换为/从 Ruby 类(现在可以)并将符合该 XSD 的 XML 转换为/从这些类的实例。

于 2009-12-14T01:11:27.403 回答
6

尽管前一段时间有人问过这个问题,但我遇到了一个解决方案,并认为它可能对未来的人们有所帮助。

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

我找到的解决方案是soap4rhttps://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_yamlto_json但我没有找到任何简单的到 XML 的转换。所以它归结为我自己的“to_xml”。

希望这可以帮助。

于 2011-03-31T17:28:13.627 回答
4

看来这可能会奏效。

需要'xsd/mapping' XSD::Mapping.obj2xml(xsdBasedObject)

于 2009-02-13T18:27:45.297 回答