2009-02-12 11 views
10

Gibt es eine Möglichkeit, Ruby-Klassen (vielleicht sogar ActiveResource-Klassen) von einer XSD zu generieren, so dass sie eine Möglichkeit zum Serialisieren der Klassen in XML für die ursprüngliche XSD enthalten?Generieren Ruby-Klassen von XSD

Ich weiß, dass soap4r xsd2ruby hat, aber es scheint, dass die generierten Ruby-Klassen nicht leicht in xml serialisiert werden können.

+0

Es gibt eine Möglichkeit, ActiveX-Klassenobjekte in XML zu serialisieren. Aber ich glaube nicht, dass Sie nach etwas dieser Art suchen. – Chirantan

Antwort

3

Es scheint, dass dies funktioniert.

erfordern 'xsd/Mapping' XSD :: Mapping.obj2xml (xsdBasedObject)

5

Shameless Eigenwerbung (hoffe, das ist okay, auf Stackoverflow), aber ich arbeite an einem Open-Source-Projekt zu tun, nur that

Es ist immer noch in Arbeit (schicken Sie Patches), aber das ultimative Ziel ist XSD zu/von Ruby-Klassen zu konvertieren (was es jetzt tut) und XML konform zu dieser XSD zu/von Instanzen dieser Klassen zu konvertieren.

5

Mark,

Obwohl dies vor einiger Zeit gefragt wurde, stieß ich auf eine Lösung und dachte, es Leute in der Zukunft helfen könnten.

Mein Bedarf war ähnlich. Ich habe eine .xsd von einem Kollegen und möchte eine Klassendatei von ihm erzeugen. Meine Hoffnung ist, dass ich das Objekt leicht marshallen kann und es an seinen REST-fähigen Endpunkt übergeben kann, wo sein Java-Server die Nutzlast entmarshallt und dynamisch das Objekt auf seiner Seite ohne zusätzlichen Aufwand baut.

Die Lösung, die ich fand, war die soap4r von https://github.com/rubyjedi/soap4r zu bekommen. Ich habe die beiden * .rb Dateien im Verzeichnis bin ausführbare Datei und dann lief:

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

Diese eine neue Datei erzeugt mit jedem der xsd:complexType als Klasse implementiert. Alle anderen komplexen Typen wurden auch mit den richtigen Vererbungsbeziehungen generiert, und xsd:element wurde als Instanzvariable definiert und auch ein Klasseninitialisierer definiert.

Lauf xsd2ruby.rb selbst die Optionen ergab:

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

Aus Gründen der Vollständigkeit, dehnte ich meine Klasse mit der folgenden (dies ist ein "Prospect" Klasse):

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

Diese Lassen Sie mich es als den Körper einer Net::HTTP::Post Anfrage verwenden.

Auf die Frage eines freien to_xml: Ich habe es nicht gefunden. Das Ruby-Objekt kommt mit einem to_yaml und to_json aus der Box, aber ich habe keine einfache Konvertierung in XML gefunden. Also kam es auf eine eigene Rolle "to_xml".

Hoffe, das hilft.

Verwandte Themen