左に Go を貼って 「変換」 を押すと XML にしますGo コードを貼り付け

このツールについて

Go の struct に合わせて XML ペイロードを組み立てた経験があるなら — SOAP クライアント、RSS フィード、レガシー SaaS の webhook、ベンダーのサイトマップ向けなど — それがどれだけ面倒か分かっているはずです。自分で xml.Marshal を呼んでもいいですが、main.go を書いてコンパイルし、出力を目で確認する手間がかかります。代わりにここに Go を貼り付ければ、整形された XML が一発で返ります。struct 1 つ、複数入ったファイル、Go by Example からコピペしたリテラル — どれでも同じで、すべてのフィールドを保った完全な XML ドキュメントが出ます。

実際に encoding/xml パッケージが生成するものをそのまま再現しています。xml:"OrderId,attr" はフィールドを親要素の属性にし、xml:"-" は除外、xml:",omitempty" はゼロ値のとき要素を省略、xml:"Items>OrderItem" は slice を <Items> コンテナでくるみ、要素ごとに <OrderItem> を 1 つ入れます。xml:",chardata" は値をテキストコンテンツにします。XMLName xml.Name は要素自体の名前を変えます。nil のポインタフィールドは ,omitempty が付いていないときのみ空要素として出力されます — 標準ライブラリとまったく同じ挙動です。

スカラーは Go の扱いと同じです。float64 は収まれば指数表記せず、time.Time は RFC 3339、ブール値は小文字の true/falseint/uint はパディングなしで出力されます。ネストした struct はネストした要素に、struct の slice は同じ階層の繰り返し要素になります。encoding/xml は map をネイティブにはサポートしていません — ツールは <Entry><Key/><Value/></Entry> の繰り返し子要素に平坦化するので形が崩れません。慣用的な Go を書いているなら、Effective Go のスタイルガイドがこのツールの想定するパターンの参考になります。

使い方

3 ステップ。struct 1 つでもパッケージファイル丸ごとでも同じです。

1

Go を貼る(またはサンプルを試す)

左のエディタに Go をそのまま貼ります。単一の struct 宣言、imports と複数の型が入った ファイル全体order := Order{...} のような composite literal — どれでも動きます。最初に サンプルを読み込む を押すと現実的な例が入ります。

package 行を消したり import を削ったり、ファイルを整理したりする必要はありません。gofmt を通した状態でそのまま貼ってください。バッククォートの struct タグも想定内です。

2

変換を押す

緑の 変換 ボタンをクリック。ツールが Go を読み、すべての xml struct タグを尊重して XML を一気に構築します。実行中は短いローディング表示が出ます。

3

XML をコピー

右のパネルに、標準準拠の XML パーサー が受け付ける整形済み XML が入ります。SOAP エンベロープ、設定ファイル、テストフィクスチャ、API ドキュメントにそのまま貼り付けてください。

実際に役立つ場面

SOAP クライアントのフィクスチャ作成

Go サービスからレガシーなエンタープライズ SOAP API と話すとき。リクエスト struct を貼れば、SoapUI や Postman、テストスイートにそのまま使える XML ボディが手に入ります。

RSS / Atom フィード

Channel、Item、enclosure を持つフィード struct が動く RSS / Atom テンプレートになります — ハンドラを実装する前にタグ構造を確認するのに便利です。

ベンダーの設定ファイル

サイトマップ、ロギングパイプライン、レガシーな運用コンソールなど、今でも XML 設定を食う SaaS ツールはあります。Go の設定 struct を貼って XML をそのまま流し込めます。

ドキュメントを正確に保つ

実際の Go 型から README や API リファレンス用の XML 例を生成すれば、main に入っているコードとサンプルがズレません。

よくある質問

複数の struct を一度に貼ってもいい?

はい — ファイルごと貼ってください。order := Order{...} のような composite literal があればそれを、なければ他の struct を参照している最初の struct をルートとして検出します。ネストした struct や兄弟 struct はネスト要素または別フラグメントとして出力されるので、静かに落ちることはありません。

xml:"x,attr"、xml:"-"、xml:",omitempty" のような struct タグに対応している?

はい — 一般的なバリエーションにも対応しています。xml:"name" は要素名を変更、xml:"name,attr" は親の属性として出力、xml:"-" はフィールドを完全に除外、xml:",omitempty" はゼロ値のフィールドをスキップ、xml:"a>b" は slice を <a> でくるんで要素ごとに <b> を入れる、xml:",chardata" は値を要素テキストに、xml:",innerxml" は生の XML としてそのまま通します。encoding/xml Marshal のドキュメントの挙動と一致します。

特殊な XMLName フィールドは?

xml.Name 型で XMLName という名前のフィールドがあると、ルート要素名が変わります。XMLName xml.Name `xml:"Order"` なら <Order>...</Order> になります。なければツールは struct 型名をルートに使います — xml.Marshal と同じデフォルトです。

ポインタ、slice、map はどう扱う?

nil のポインタフィールドは、,omitempty が指定されていれば省略、そうでなければ空要素として出力します。struct の slice は繰り返しの兄弟要素になります(タグが a>b の形式のときはコンテナで包みます)。map は encoding/xml がネイティブに扱わないため、ツールは <Entry><Key/><Value/></Entry> の子要素の列として出力します — 多くの場面で十分で、別の形にしたければ編集しやすい形です。

貼ったコードは保存される?

変換のためにバックエンドに送られますが、保存はしません — ペイロードのログも取りません。オンラインツール共通の注意として、本当に機密性の高いコードを貼る前には一度目で確認してください。

struct が encoding/xml の非対応型(channel、func、complex)を使っていたら?

変換全体を失敗させずに空要素として出します。ランタイムでの xml.Marshal の挙動(エラーを返す)に対し、こちらは先に進むので残りの結果は得られます。Go 自体に構文エラーがあるなら、明らかなものから直してください — パーサーは寛容ですが完全な gc ではありません。

合わせて使えるツール

Go → XML はパズルの一片です。以下のツールと相性がよいです。