Go → XML コンバーター
Go struct を貼り付け、きれいな XML を取得。
このツールについて
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/false、int/uint はパディングなしで出力されます。ネストした struct はネストした要素に、struct の slice は同じ階層の繰り返し要素になります。encoding/xml は map をネイティブにはサポートしていません — ツールは <Entry><Key/><Value/></Entry> の繰り返し子要素に平坦化するので形が崩れません。慣用的な Go を書いているなら、Effective Go のスタイルガイドがこのツールの想定するパターンの参考になります。
使い方
3 ステップ。struct 1 つでもパッケージファイル丸ごとでも同じです。
Go を貼る(またはサンプルを試す)
左のエディタに Go をそのまま貼ります。単一の struct 宣言、imports と複数の型が入った ファイル全体、order := Order{...} のような composite literal — どれでも動きます。最初に サンプルを読み込む を押すと現実的な例が入ります。
package 行を消したり import を削ったり、ファイルを整理したりする必要はありません。gofmt を通した状態でそのまま貼ってください。バッククォートの struct タグも想定内です。
変換を押す
緑の 変換 ボタンをクリック。ツールが Go を読み、すべての xml struct タグを尊重して XML を一気に構築します。実行中は短いローディング表示が出ます。
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 はパズルの一片です。以下のツールと相性がよいです。