2009-02-12 27 views
10

¿Hay alguna forma de generar clases de Ruby (tal vez incluso clases ActiveResource) desde un XSD para que contengan una manera de serializar las clases a xml válidas para el XSD inicial?Generar clases de Ruby desde XSD

Sé que soap4r tiene xsd2ruby pero parece que las clases de ruby ​​generadas no se pueden serializar fácilmente en xml.

+0

Hay una manera en que puede serializar objetos-clase activerecord a xml. Pero no creo que estés buscando algo de ese tipo. – Chirantan

Respuesta

3

Parece que esto podría funcionar.

require 'xsd/mapeo' XSD :: Mapping.obj2xml (xsdBasedObject)

5

auto promoción Shameless (espero que esto está bien en stackoverflow) pero estoy trabajando en un proyecto de código abierto para hacer precisamente that

Todavía es un trabajo en progreso (no dude en enviar parches) pero el objetivo final es convertir XSD a/de las clases de Ruby (lo que hace ahora) y convertir XML conforme a ese XSD en instancias de esas clases.

5

Marcos,

Aunque esto se le preguntó hace un tiempo, me encontré con una solución y pensó que podría ayudar a la gente en el futuro.

Mi necesidad era similar. Tengo un .xsd de un colega y me gustaría generar un archivo de clase a partir de él. Mi esperanza es que pueda ordenar fácilmente el objeto y pasarlo a su punto final RESTful, donde su servidor Java destrabará la carga y construirá dinámicamente el objeto de su lado sin ningún esfuerzo adicional.

La solución que encontré fue obtener el soap4r de https://github.com/rubyjedi/soap4r. Hice los dos archivos * .RB en el ejecutable bin y luego corrió:

bin/xsd2ruby.rb --xsd <source>.xsd --classdef <filename_prefix> 

Esto genera un nuevo archivo con cada uno de los xsd:complexType implementado como una clase. Todos los demás tipos complejos también se generaron con las relaciones de herencia correctas y todos xsd:element se definieron como una variable de instancia y también se definió un inicializador de clase.

Correr xsd2ruby.rb por sí solo produjo las opciones:

~/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 

En aras de la exhaustividad, extendí mi clase con la siguiente (esto es una clase de "Prospecto"):

class Prospect 
    include Enumerable 
    def each(&block) 
    self.instance_variables.collect{|v| (v.gsub /@/, '').to_sym }.each(&block) 
    end 
end 

Este permítanme usarlo como el cuerpo de una solicitud Net::HTTP::Post.

A la pregunta de un to_xml gratis: No lo he encontrado. El objeto Ruby viene con un to_yaml y to_json de fábrica, pero no he encontrado ninguna conversión simple a XML. Así que se redujo a un rollo mi propio "to_xml".

Espero que esto ayude.

Cuestiones relacionadas