Генерация Ruby-классов из XSD - PullRequest
11 голосов
/ 13 февраля 2009

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

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

Ответы [ 3 ]

6 голосов
/ 14 декабря 2009

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

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

6 голосов
/ 31 марта 2011

Марк,

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

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

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

4 голосов
/ 13 февраля 2009

Похоже, это может сработать.

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

...