Создание классов 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)