XSDからRubyクラス(おそらくActiveResourceクラス)を生成して、最初のXSDに有効なxmlにクラスをシリアル化する方法が含まれるようにする方法はありますか?
soap4rにxsd2rubyがあることは知っていますが、生成されたrubyクラスをxmlに簡単にシリアル化できないようです。
XSDからRubyクラス(おそらくActiveResourceクラス)を生成して、最初のXSDに有効なxmlにクラスをシリアル化する方法が含まれるようにする方法はありますか?
soap4rにxsd2rubyがあることは知っていますが、生成されたrubyクラスをxmlに簡単にシリアル化できないようです。
恥知らずな自己宣伝(これがstackoverflowで問題ないことを願っています)が、私はそれを行うためのオープンソースプロジェクトに取り組んでいます
まだ進行中の作業です (気軽にパッチを送ってください) が、最終的な目標は、XSD を Ruby クラスとの間で変換し (現在実行中です)、その XSD に準拠する XML をそれらのクラスのインスタンスとの間で変換することです。
これは少し前に尋ねられましたが、私は解決策に出くわし、それが将来人々を助けるかもしれないと思いました。
私の必要性も同様でした。同僚からの.xsdがあり、そこからクラスファイルを生成したいと思います。私の望みは、オブジェクトを簡単にマーシャリングして、RESTfulエンドポイントに渡すことができるようになることです。そこで、彼のJavaサーバーはペイロードをアンマーシャルし、追加の作業なしでオブジェクトを彼の側で動的に構築します。
私が見つけた解決策は、 https://github.com/rubyjedi/soap4rsoap4r
から取得することでした。binディレクトリ内の2つの*.rbファイルを実行可能にしてから、次のコマンドを実行しました。
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には、すぐに使用できるaが付属してto_yaml
いto_json
ますが、XMLへの単純な変換は見つかりませんでした。それで、それは私自身の「to_xml」のロールに帰着しました。
お役に立てれば。
これは機能する可能性があるようです。
「xsd/mapping」が必要 XSD::Mapping.obj2xml(xsdBasedObject)