Kotlin → XML コンバーター
Kotlin の data class かインスタンスを貼り付け。きれいな XML が返ってきます。
このツールでできること
Kotlin の data class 用に XML のペイロードを手書きした経験があれば — Android のリソースファイル、まだ置き換えられていない SOAP エンドポイント、結合テストのフィクスチャ用など — あの打鍵の面倒さはご存じのはず。ここに Kotlin を貼り付ければ、整形済みの XML が一発で返ってきます。単独の data class、複数の data class と sealed class を含むファイル、値を入れた val order = Order(...) インスタンス — どれも結果は同じで、全プロパティを保持した完全な XML ドキュメントになります。
単純な文字列置換ではありません。このコンバーターは Kotlin が実際に XML へシリアライズする方法を理解していて — おおむね kotlinx.serialization と同じやり方です。BigDecimal は数値テキストのまま、Instant と LocalDateTime は ISO-8601 文字列、値が null の nullable は空要素、List<T> と Map<K,V> は一貫したコンテナ構造に従います — リストはラッパー要素になり、各要素は要素型の名前を持つ子になります。
シリアライゼーションのアノテーションも尊重します。プロパティ上の @SerialName("x") は出力の要素名をリネームし、@Transient はプロパティを落とし、クラスレベルの @SerialName("x") はルート要素をリネームします。sealed class の階層は型ディスクリミネーターでフラット化され、あとでラウンドトリップできます。複数の data class を貼り付ければ、ネストした型を展開し、デフォルト値を埋めた状態でそれぞれが出力に現れます。詳しくは Kotlin シリアライゼーション公式ドキュメントを読む価値ありです。
使い方
3 ステップ。5 行貼り付けるのも、モデルファイル丸ごと貼り付けるのも同じです。
Kotlin を貼り付け(サンプルでもOK)
左のエディタに Kotlin をそのまま投げ込んでください。data class、sealed class の階層、値を入れた val インスタンス、複数クラスのファイルいずれも大丈夫です。リアルな例を先に見たいときは サンプルを読み込む をクリック。
import 文を剥がしたり、アノテーションを消したり、Kotlin 構文をきれいにする必要はありません。IDE のままのコードで OK。ただ貼り付けるだけです。
変換をクリック
緑色の 変換 ボタンを押します。ツールは Kotlin を読み込み、クラスとプロパティをすべて保持したまま、一発で XML を組み立てます。その間、短いローディング表示が出ます。
XML をコピー
右側のパネルにインデント済みの整形された XML が埋まります。標準準拠の XML パーサーが受理する形式です。Android リソース、SOAP リクエスト、設定ファイル、テストフィクスチャにそのままコピーしてください。
実際に役に立つ場面
Android のレイアウトとリソース XML
<a href="https://developer.android.com/guide/topics/resources/providing-resources" target="_blank" rel="noopener">Android XML リソース</a>にマップされる Kotlin モデル — プリファレンス画面、string-array、カスタム属性セットなど。クラスを貼り付けて XML を取り出し、res/xml や res/values に貼り付けます。
JVM 上の SOAP クライアント
Kotlin のリクエスト型を SOAP としてアプリから出す必要がある。data class を貼り付けて XML ボディを SoapUI や Postman に投入し、エンベロープを手書きせずに契約を検証できます。
テストフィクスチャの種データ
ユニットテストで使っている <code>val order = Order(...)</code> インスタンスを、結合テスト、モックサーバー、まだ XML をしゃべるレガシーシステム用のシード XML ファイルに変換します。
ドキュメントをコードと一致させる
README、API リファレンス、XSD 付きのスキーマドキュメント用の XML 例を、実際の Kotlin モデルから直接生成します。コードからドキュメントがずれずに済みます。
よくある質問
複数の data class を一度に貼り付けてもいい?
はい — ファイル丸ごと貼り付けて大丈夫です。トップレベルの data class と sealed class はすべて、ネストした型を展開しデフォルト値を埋めた状態で出力に現れます。黙って落とされるものはありません。
@SerialName と @Transient は尊重される?
はい。プロパティ上の @SerialName("x") は出力の要素名をリネームし、クラス上の @SerialName("x") はラッパーのルート要素をリネームし、@Transient はプロパティを完全に落とします。kotlinx.serialization と同じ挙動です。
BigDecimal、Instant、nullable はどう扱われる?
BigDecimal はそのままの数値テキストで出ます(BigDecimal("...") のラッパーは付きません)。Instant と LocalDateTime は ISO-8601 文字列になります。値が null の nullable は落とさずに空要素として出力するので、XSD で検証するコンシューマー向けに形が一貫します。
sealed class、List、Map は?
sealed class の階層は型ディスクリミネーター属性でフラット化され、あとでラウンドトリップできます。List<T> はコンテナ要素になり、各要素型の名前を持つ子がアイテムごとに入ります — List<OrderItem> items は <items><OrderItem/><OrderItem/></items> になります。Map<K,V> は <Entry><Key/><Value/></Entry> のコンテナになります。
コードは保存される?
コードは変換のためにバックエンドに送られますが永続化しません — ペイロードのログも取っていません。オンラインツール全般の話ですが、本当に機密性のあるコードなら貼り付ける前に一度目を通してください。
companion object、拡張関数、コルーチンなど変わったものが入っていたら?
companion object はインスタンスの状態ではないので XML 出力では無視されます。拡張関数とトップレベル関数はスキップされます。コード自体に構文エラーがあれば、明らかなものは先に直してください — パーサーは寛容ですが超能力者ではありません。
合わせて使えるツール
Kotlin → XML はパズルの 1 ピースにすぎません。以下とも相性が良いです: