左側に Python を貼り付けて "Convert" をクリックすると、XML に変換しますPython コードを貼り付け

このツールでできること

Python のクラスを反映した XML ペイロードを手作業で組み立てた経験があるなら — SOAP エンドポイント向け、設定ファイル、レガシーな連携、テスト用フィクスチャのどれでも — その面倒さはお馴染みのはず。xml.etree.ElementTree と 1 時間戦った挙句、ネストしたフィールドを忘れていたことに気づく、というやつです。ここに Python を貼り付ければ、1 回の処理で整形済みの XML が返ります。通常の dict でも、dataclass でも、Pydantic モデルでも、深くネストされた構造でも結果は同じです。

単純な文字列置換ではありません。Python の値が実際に XML にどう対応するかを理解しています。Decimal("49.99") はそのままの数値テキストに、datetimedate は ISO-8601 文字列として、UUID は標準の 8-4-4-4-12 の 16 進文字列に、None を持つ Optional[...] フィールドは破棄されずに空要素になり、list[T]List[T] はコンテナ要素となって 1 アイテムにつき 1 つの子要素(アイテム型の名前付き)を持ちます。xmltodictlxml のようなライブラリが出すのと同じ形です。

型ヒントも尊重されます。@dataclass のフィールド名はそのまま要素名になります。Pydantic モデルの Field(alias="x") は要素名を変更します。dataclass の field(metadata={"xml": "attribute"}) は値を子要素ではなく属性として出力します。_ で始まるプライベートフィールドは落とされます。複数のクラスを貼り付けると、それぞれがネスト型を展開し、継承属性も統合した形で出力されます。黙って無視されるものはありません — フィールドがあれば XML に出てきます。

使い方

3 ステップです。5 行の dict を貼り付けても、models.py 全体を貼り付けても、やり方は同じです。

1

Python を貼り付ける(サンプルを試すのも OK)

左側のエディタに Python をそのまま貼り付けてください。dict リテラルdataclassPydantic BaseModelネストされたクラスインスタンス代入 のどれでも大丈夫です。実際の Order / OrderItem / Address のような例を先に見たければ Load Sample を押してください。

import、デコレーター、型ヒントはそのままで大丈夫です。外す必要はありません — パーサーは typing のアノテーションを読んで出力型を決めます。

2

Convert を押す

緑の Convert ボタンをクリックします。ツールが Python を読み、すべてのクラスと属性を保ったまま、1 回の処理で XML を出力します。処理中は短いローディング表示が出ます。

3

XML をコピーする

右側のパネルには、準拠した XML パーサーがそのまま受け取れる、インデント付きの整形済み XML が表示されます。SOAP リクエスト、設定ファイル、テスト用フィクスチャ、ドキュメントなどへそのまま貼り付けてください。

こんなときに便利です

SOAP・レガシー連携のフィクスチャ

Pydantic のリクエストモデルがあって、レガシー SOAP サービスに送る XML ボディが必要なとき。モデルを貼って XML を取得し、テストランナーに貼り付けるだけで完了です。

dataclass を設定ファイルに

30 フィールドある Settings dataclass を、XML ベースの設定ストア用にすぐ編集できる XML テンプレートに変換できます。手書きのスキャフォールドもタイポもありません。

XSD ドキュメントを正しく保つ

コード内の実際のモデルから、README、API リファレンス、XSD ベースのスキーマドキュメント用の XML サンプルを直接生成できるので、例が現実とずれません。

統合テスト用のシード

pytest フィクスチャのインスタンスリテラルを、XML を話す仕組み — レガシー API、モックサーバー、XSLT パイプライン — 向けの XML シードファイルに変換できます。

よくある質問

dataclass、Pydantic、通常の dict に対応していますか?

はい、3 つとも対応しています。@dataclassPydantic BaseModel のフィールド名は要素名として使われます。通常の dict リテラルも使えます — キーが要素名になり、値は型に応じて出力されます。ネストされたモデルや dict はネスト要素として展開されます。

Decimal・datetime・UUID はどう扱われますか?

Decimal("49.99") は要素テキストとして 49.99 になります。datetimedatetimeISO-8601 文字列として出力されます。UUID は標準の 8-4-4-4-12 の 16 進文字列になります。Enum サブクラスは .value を出します。set はリストと同じくコンテナ要素になります。

Optional[...] や None はどうなりますか?

None を持つフィールドは破棄されず、空要素(<field/>)として書き出されます — 出力の形が一貫するので、下流の XSD が要素の存在を要求する場合にも安心です。

要素名を変更したり、フィールドを属性にしたりできますか?

できます。Pydantic モデルでは Field(alias="x") が要素名を変更します。dataclass では field(metadata={"xml": "attribute"}) でフィールドを親要素の属性へ、metadata={"xml": "name", ...} で名前を変更できます。アンダースコア始まりのプライベートフィールド(_cache_tmp)はデフォルトで落とされます。

複数のクラスをまとめて貼り付けられますか?

はい — models.py 全体を貼り付けて大丈夫です。各トップレベルのクラスは、ネスト型が展開され、基底クラスから継承したフィールドも含めて出力されます。インスタンス代入も含まれていればそのインスタンスがシリアライズされ、なければデフォルト値が解決できる最初のクラスが使われます。

コードは保存されますか?

コードは変換のためにバックエンドへ送られますが、保存はしません — ペイロードのログも取りません。オンラインツール全般に言えることですが、本当に機密性が高いものは貼り付ける前に内容を確認してください。

一緒に使えるツール

Python から XML への変換はパズルの一部です。一緒に使うと便利なツールをまとめました: