11 Stimmen

Erzeuge Ruby-Klassen aus XSD

Gibt es einen Weg, Ruby-Klassen (vielleicht sogar ActiveResource-Klassen) aus einem XSD zu generieren, so dass sie eine Möglichkeit enthalten, die Klassen in XML zu serialisieren, das für das ursprüngliche XSD gültig ist?

Ich weiß, dass soap4r xsd2ruby hat, aber anscheinend können die erzeugten Ruby-Klassen nicht einfach in XML serialisiert werden.

0 Stimmen

Es gibt einen Weg, wie du ActiveRecord-Klassen-Objekte zu XML serialisieren kannst. Aber ich glaube nicht, dass du nach so etwas suchst.

7voto

Mo. Punkte 79

Schamlose Eigenwerbung (hoffentlich ist das okay auf Stackoverflow), aber ich arbeite an einem Open-Source-Projekt, um genau das zu tun

Es ist immer noch ein laufendes Projekt (sende gerne Patches) aber das ultimative Ziel ist es, XSD in/from Ruby-Klassen umzuwandeln (was es jetzt tut) und XML, das dieser XSD entspricht, in/aus Instanzen dieser Klassen umzuwandeln.

7voto

Auch wenn diese Frage vor einiger Zeit gestellt wurde, bin ich auf eine Lösung gestoßen und dachte, dass sie zukünftigen Personen helfen könnte.

Mein Bedarf war ähnlich. Ich habe eine .xsd von einem Kollegen und möchte gerne eine Klassendatei daraus generieren. Ich hoffe, dass ich das Objekt leicht marshallen und es an seinen RESTful Endpunkt übergeben kann, wo sein Java-Server das Nutzlast entmarshalled und das Objekt auf seiner Seite dynamisch aufbaut, ohne zusätzlichen Aufwand.

Die Lösung, die ich gefunden habe, war, das soap4r von https://github.com/rubyjedi/soap4r zu bekommen. Ich habe die beiden *.rb-Dateien im bin-Verzeichnis ausführbar gemacht und dann ausgeführt:

bin/xsd2ruby.rb --xsd .xsd --classdef 

Dies generierte eine neue Datei, in der jede xsd:complexType als Klasse implementiert wurde. Alle anderen komplexen Typen wurden ebenfalls mit den korrekten Vererbungsbeziehungen generiert und alle xsd:element wurden als Instanzvariablen definiert und ein Klassen-Initializer wurde auch definiert.

Das Ausführen von xsd2ruby.rb für sich allein ergab die folgenden Optionen:

~/src/test/soap4r:bin/xsd2ruby.rb 
Usage: bin/xsd2ruby.rb --xsd xsd_location [options]
  xsd_location: Dateiname oder URL

Beispiel:
  bin/xsd2ruby.rb --xsd myapp.xsd --classdef foo

Optionen:
  --xsd xsd_location
  --classdef [Dateipräfix]
  --mapping_registry
  --mapper
  --module_path [Modul::Pfad::Name]
  --force
  --quiet

Zur Vollständigkeit habe ich meine Klasse wie folgt erweitert (dies ist eine "Prospect" Klasse):

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

Dies erlaubte mir, es als den Inhalt einer Net::HTTP::Post Anfrage zu verwenden.

Zur Frage nach einem kostenlosen to_xml: Ich habe es nicht gefunden. Das Ruby-Objekt wird standardmäßig mit einem to_yaml und to_json geliefert, aber ich habe keine einfache Konvertierung zu XML gefunden. Also kam es darauf an, mein eigenes "to_xml" zu machen.

Hoffe, das hilft.

3voto

Es scheint, dass dies funktionieren könnte.

require 'xsd/mapping' XSD::Mapping.obj2xml(xsdBasiertesObjekt)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X