Ruby → XML 変換ツール
Ruby のクラスやオブジェクトを貼るだけ。きれいな XML を返します。
このツールでできること
Ruby のクラスに合う XML ペイロードを手作業で組み立てたことがあるなら — Rails の to_xml フィクスチャ、レガシーな SOAP コール、あるいは Nokogiri Builder のテンプレートなど — 定型コードがあっという間に膨らむのを知っているはずです。ここに Ruby を貼り付ければ、整形された XML が一回で戻ってきます。attr_accessor のクラス 1 つ、Struct.new、モデルファイル全体、深くネストされたオブジェクトのどれでも結果は同じで、すべてのフィールドを残した完全な XML ドキュメントが得られます。
ただの文字列置換ではありません。Ruby の値が実際にどうシリアライズされるかを理解しています: BigDecimal("49.99") は指数表記なしのシンプルな数値文字列として、Time と DateTime は ISO-8601 文字列で、Symbol は先頭のコロンが外され、nil は削除されずに空要素として出力され、配列はエントリごとに子を 1 つ持つコンテナ要素になります — Nokogiri::XML::Builder や Rails の to_xml が通常生成するものと同じです。
クラス構造も尊重されます。各トップレベルクラスはクラス名 (snake_case) のルート要素になり、attr_accessor のシンボルは子要素に、ネストされたオブジェクトはインラインで展開され、OrderItem の配列は <items> ラッパーの中にエントリごとに <order_item> が 1 つずつ並ぶ形になります。ハッシュはキー/値の子要素に。継承された属性もちゃんと出ます。Rails のモデルや素の PORO を貼り付けても、render xml: や REXML::Document.new (REXML 参照) が返してくれるのと同じようなもの、ただし儀式は一切抜きで手に入ります。
使い方
3 ステップ。単一の Struct を貼る場合も lib フォルダ丸ごとを貼る場合も同じ流れです。
Ruby を貼り付ける(またはサンプルを試す)
左のエディタに Ruby をそのまま投げ込んでください。attr_accessor クラス、Struct.new の短縮形、複数のクラス、値の入った インスタンス — どれでも OK です。まずは サンプルを読み込む を押して、現実的な Order の例を見てみてください。
require 行を外したり、モジュールを剥がしたり、構文を簡略化したりする必要はありません。エディタで見えているままで、ただ貼り付けるだけです。
「変換」を押す
緑の 変換 ボタンをクリック。ツールが Ruby を読み取り、すべてのクラスと属性を保ったまま、XML を一度に組み立てます。動作中は短く光るアニメーションが入ります。
XML をコピー
右のパネルに、インデントされた整形済みの XML が表示されます。どの標準準拠パーサでも受け付けられる形です。SOAP リクエスト、RSpec のフィクスチャファイル、Rails の統合テスト、API ドキュメントにそのまま貼り込めます。
こんなときに便利
Nokogiri や Builder のフィクスチャ作成
Ruby のクラスがあって、Nokogiri::XML::Builder や ERB テンプレート用の XML の下地がほしい。クラスを貼って XML を取り、Builder ブロックに流し込めば完了です。
Rails to_xml のシードデータ
20 個の属性を持つ ActiveRecord モデルや PORO が、統合テスト用や XML を今でも使う外部システム向けに、編集可能な XML シードファイルに早変わりします。
レガシーな SOAP 連携
古い SOAP/XML-RPC サービスと話す Ruby クライアントで、Ruby のクラスに合うリクエストボディが必要なとき。モデルを貼って XML エンベロープの形を取得し、<a href="https://www.ruby-doc.org/" target="_blank" rel="noopener">Savon</a> テンプレートと格闘するのをやめましょう。
ドキュメントとコードを同期させる
README、API リファレンス、XSD ベースのドキュメント用の XML レスポンス例を、実際の Ruby モデルから直接生成。ドキュメントがコードから乖離することがなくなります。
よくある質問
複数のクラスをまとめて貼れますか?
はい — lib ファイル丸ごと貼って大丈夫です。各トップレベルクラスは、ネストされたクラスが展開され、スーパークラスの属性も取り込まれた状態で出てきます。ミックスインは attr_accessor を提供するものとして扱われます。黙って落とされるものはありません。
Struct.new の短縮形は効きますか?
はい。Order = Struct.new(:order_id, :customer_name, :total_amount) は、対応する attr_accessor を持つクラスと同じ扱いになります。キーワード形式の struct (Struct.new(:a, keyword_init: true)) もいけます — どちらでも出力される XML は同じです。
BigDecimal、Time、Symbol、nil はどう扱われますか?
BigDecimal("49.99") は素直な文字列 49.99 になります(指数表記なし、末尾の bd マーカーもなし)。Time、DateTime、Date は ISO-8601 文字列として出ます。Symbol はコロンを落としてプレーンテキストに。nil は削除されずに空要素 (<field/>) として残るので、XML の形が崩れません。
配列、ハッシュ、ネストされたオブジェクトはどうなりますか?
配列はコンテナ要素になります — items = [OrderItem.new, OrderItem.new] は <items><order_item/><order_item/></items> となり、要素クラスに由来する名前で、エントリごとに子が 1 つずつ。ハッシュは <entry><key/><value/></entry> のペアに。ネストされたオブジェクトはインラインで子要素として展開され、Rails の to_xml と同じ扱いになります。
コードは保存されますか?
変換のためにバックエンドへ送信されますが、保存はしません — ペイロードのログも取っていません。オンラインツール全般に言えることですが、Ruby 内に本当に機密なリテラル(API キーや顧客の個人情報など)が含まれている場合は、貼り付ける前に取り除いてください。
メタプログラミングや define_method を使っているコードはどうですか?
実行時にしか存在しないもの(define_method で追加されたメソッド、method_missing 経由で設定される属性、計算された属性を持つミックスインモジュールなど)は、静的なコードだけからは推測できません。このツールは、宣言された attr_accessor、attr_reader、Struct のフィールド、明示的な代入を読み取ります。メタプログラミングでしか現れないフィールドがあれば、コンバータが見られるように attr_accessor として書いておいてください。
あわせて便利なツール
Ruby → XML は一部です。これらと組み合わせるとさらに便利です: