Dart から XML へのコンバーター
Dart のクラスやオブジェクトを貼り付けると、きれいな XML が返ってきます。
このツールでできること
レガシーな SOAP エンドポイントと通信する Flutter アプリ、Android 風の XML 設定、RSS リーダー — Dart のモデルに合わせた XML ペイロードを整形しなければならなかった経験があれば、あのボイラープレートの多さは身にしみているはずです。ここに Dart を貼り付ければ、整形済みの XML が一度の処理で返ってきます。final フィールドを持つクラスひとつでも、モデルファイルまるごとでも、値が入ったインスタンスでも、結果は同じ:すべてのフィールドが保たれた完全な XML ドキュメントです。
単純な文字列置換ではありません。コンバーターは本物の Dart を読みます。required 付きの名前付きパラメータは宣言順に要素になり、final フィールドは非 final と同じように扱われ、DateTime 値は ISO-8601 文字列としてレンダリングされ、Duration は ISO-8601 の期間表記を使い、num、int、double は数値としての形を保ち、null(String? のような nullable 型)は省略されずに空要素になり、List<T> は要素ごとに子を持つコンテナ要素になります — これは xml パッケージの XmlBuilder が出力するものと同じです。
クラス構造は保たれます。各トップレベルクラスはクラス名を持つルート要素になり、各フィールドは子要素になり、ネストされたクラスはインラインで展開され、Map<K, V> は <entry><key/><value/></entry> のペアになります。json_annotation の @JsonKey(name: "x") のようなアノテーションは、要素のリネームヒントとして尊重されます。Flutter のモデル、freezed スタイルのデータクラス、素の Dart POJO — どれを貼っても、手書きの XmlBuilder 呼び出しが生成するような XML が、面倒な儀式抜きで手に入ります。
使い方
たった 3 ステップ。単一のモデルを貼っても、<code>lib/models</code> フォルダ一式を貼っても同じ流れです。
Dart を貼り付ける(またはサンプルを試す)
Dart コードをそのまま左側のエディタに投げ込んでください。通常のクラス、名前付きコンストラクタを持つデータクラス、複数のクラス、値が入った インスタンス — どれでも OK です。リアルな Order の例をまず見るには サンプルを読み込む をクリックしてください。
import を取り除いたり、part ディレクティブを削ったり、アノテーションを消したりする必要はありません。IDE で見えているままのコードで大丈夫です。貼り付けるだけです。
変換を実行
緑の 変換 ボタンをクリックします。ツールが Dart を読み、すべてのクラスとフィールドを保ちつつ、一度の処理で XML を組み立てます。処理中は短いローディングが表示されます。
XML をコピー
右側のパネルがインデント付きで整形済みの XML で埋まります。標準準拠の XML パーサーならどれでも受け付けるかたちです。SOAP リクエスト、Flutter のアセットファイル、Android 風の設定、単体テストのフィクスチャなどに貼り付けて使ってください。
実際にありがたい場面
SOAP サービスと通信する Flutter アプリ
Flutter アプリからレガシーな SOAP エンドポイントを呼び、リクエストボディを Dart のモデルに合わせる必要がある場面。モデルを貼って XML を取り、<code>http.post</code> や <a href="https://pub.dev/packages/xml" target="_blank" rel="noopener">xml</a> パッケージに渡すだけです。
RSS や Atom のフィードジェネレーター
ポッドキャストやニュースアプリで RSS を配信していますか? エピソードのモデルを貼って、必要な XML のかたちを得て、あとはフィードのエンベロープで包むだけ — <code><item></code> の子要素を手で数える必要はもうありません。
Android/iOS ネイティブの XML 設定
platform channels で使っている Dart モデルから、Android スタイルの設定 XML や iOS の plist 風の構造を生成したい場面。クラスを貼り付ければ、すぐに手直しできるテンプレートが手に入ります。
flutter_test 用のテストフィクスチャ
値が入ったモデルを <code>flutter_test</code>、ウィジェットの golden テスト、モックした HTTP レスポンス用の XML フィクスチャファイルに変換します。フィクスチャ文字列を手で書くより遥かに速いです。
よくある質問
複数のクラスを一度に貼り付けてもいいですか?
はい、models.dart ファイル丸ごと、またはモデルフォルダ一式を貼り付けて大丈夫です。各トップレベルクラスは、ネストされたクラスが展開され、親クラスのフィールドも取り込まれたかたちで出力されます。mixin はフィールドを提供するものとして扱われます。何かが黙って捨てられることはありません。
freezed や json_serializable のデータクラスでも動きますか?
はい。freezed スタイルのイミュータブルなクラスと json_serializable でアノテートされたモデルは、通常の Dart クラスとして扱われます — フィールドはそのまま出力され、@JsonKey(name: "x") は要素のリネームヒントとして尊重されます。事前に build_runner を走らせる必要も、生成された .g.dart を貼り付ける必要もありません。
DateTime、Duration、null、num はどう扱いますか?
DateTime は ISO-8601 文字列(2026-04-21T10:15:00.000Z)としてレンダリングされます。Duration は ISO-8601 の期間表記(PT2H30M)、またはフォールバックとして HH:mm:ss で出力されます。null を持つ nullable 型は、省略されるのではなく空要素(<field/>)になるので、XML のかたちが一貫して保たれます。num、int、double はすべて普通の十進数テキストとしてシリアライズされます。
List、Map、ネストされたクラスはどうなりますか?
List<T> は要素ごとに子を持つコンテナ要素になり、子は要素型の名前になります — List<OrderItem> items は <items><OrderItem/><OrderItem/></items> になります。Map<K, V> は <entry><key/><value/></entry> のペアになります。ネストされたクラスはインラインで展開され、これは xml パッケージの XmlBuilder がネストされた要素を生成するのと同じやり方です。
貼り付けたコードは保存されますか?
Dart は変換のためにバックエンドへ送られますが、保存はされません — ペイロードはログにも残しません。オンラインツール全般に言えることですが、コードに本当に機密性の高いリテラル(API キー、トークンなど)が含まれるなら、貼り付ける前に伏せるかモックに置き換えてください。
クラスが dynamic や Object? のフィールドを使っている場合は?
dynamic や Object? と型付けされたフィールドは、実際のかたちが実行時にしか分からないため、代入されたリテラル値をもとに文字列テキストとしてシリアライズされます。より強い XML 出力が欲しければ、型を絞り込んでください(String、int、具体的なクラスなど)。コンバーターが自動的に構造を拾います。
あわせて使えるツール
Dart から XML はパズルの一片に過ぎません。こちらも一緒に使えます: