Создание классов Ruby из XSD

Есть ли способ генерировать классы Ruby (возможно, даже классы ActiveResource) из XSD, чтобы они содержали способ сериализации классов для xml, действительных для исходного XSD?

Я знаю, что soap4r имеет xsd2ruby, но кажется, что сгенерированные классы ruby ​​не могут быть легко сериализованы в xml.

Ответ 1

Бесстыдная самореклама (надеюсь, что это нормально в stackoverflow), но я работаю над проектом с открытым исходным кодом, чтобы сделать только который

Его работа продолжается (не стесняйтесь отправлять исправления), но конечной целью является преобразование XSD в/из классов Ruby (что теперь происходит) и преобразование XML, соответствующего этому XSD, в/из экземпляров этих классов.

Ответ 2

Хотя это было задано некоторое время назад, я наткнулся на решение и подумал, что это может помочь людям в будущем.

Моя потребность была похожа. У меня есть .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

Для полноты картины я расширил свой класс следующим образом (это класс "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".

Надеюсь это поможет.

Ответ 3

Кажется, что это может сработать.

требуется "xsd/mapping" XSD:: Mapping.obj2xml (xsdBasedObject)