Марк,
Хотя это было задано некоторое время назад, я наткнулся на решение и подумал, что оно может помочь людям в будущем.
Моя потребность была похожа. У меня есть .xsd от коллеги, и я хотел бы создать из него файл класса. Я надеюсь, что смогу легко маршалировать объект и передавать его в конечную точку RESTful, где его Java-сервер будет демаршировать полезную нагрузку и динамически строить объект на его стороне без дополнительных усилий.
Решение, которое я нашел, состояло в том, чтобы получить soap4r
из https://github.com/rubyjedi/soap4r. Я сделал два * .rb файла в исполняемом каталоге bin и затем запустил:
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
Ради полноты, я расширил свой класс следующим (это "Проспект"):
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 Object поставляется с to_yaml
и to_json
из коробки, но я не нашел простого преобразования в XML. Так что дело дошло до моего собственного "to_xml".
Надеюсь, это поможет.