左側に Ruby を貼り付けて 「変換」 を押すだけ — XML に変換しますRuby コードを貼り付け

このツールでできること

Ruby のクラスに合う XML ペイロードを手作業で組み立てたことがあるなら — Rails の to_xml フィクスチャ、レガシーな SOAP コール、あるいは Nokogiri Builder のテンプレートなど — 定型コードがあっという間に膨らむのを知っているはずです。ここに Ruby を貼り付ければ、整形された XML が一回で戻ってきます。attr_accessor のクラス 1 つ、Struct.new、モデルファイル全体、深くネストされたオブジェクトのどれでも結果は同じで、すべてのフィールドを残した完全な XML ドキュメントが得られます。

ただの文字列置換ではありません。Ruby の値が実際にどうシリアライズされるかを理解しています: BigDecimal("49.99") は指数表記なしのシンプルな数値文字列として、TimeDateTimeISO-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 フォルダ丸ごとを貼る場合も同じ流れです。

1

Ruby を貼り付ける(またはサンプルを試す)

左のエディタに Ruby をそのまま投げ込んでください。attr_accessor クラスStruct.new の短縮形複数のクラス、値の入った インスタンス — どれでも OK です。まずは サンプルを読み込む を押して、現実的な Order の例を見てみてください。

require 行を外したり、モジュールを剥がしたり、構文を簡略化したりする必要はありません。エディタで見えているままで、ただ貼り付けるだけです。

2

「変換」を押す

緑の 変換 ボタンをクリック。ツールが Ruby を読み取り、すべてのクラスと属性を保ったまま、XML を一度に組み立てます。動作中は短く光るアニメーションが入ります。

3

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 マーカーもなし)。TimeDateTimeDateISO-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_accessorattr_readerStruct のフィールド、明示的な代入を読み取ります。メタプログラミングでしか現れないフィールドがあれば、コンバータが見られるように attr_accessor として書いておいてください。

あわせて便利なツール

Ruby → XML は一部です。これらと組み合わせるとさらに便利です: