C++ → XML コンバーター
C++ の struct や class を貼り付けるだけ。きれいな XML が返ります。
このツールの役割
C# や Java と違って、C++ には組み込みの XML シリアライザーがありません。struct や class に合った XML ペイロードが必要なら、XML を手で書くか、pugixml を組み込むか、Xerces-C++ を引っ張ってくるか、Expat で組み立てるか — そのどれもテストを走らせる前にタイピング量がかなりの話になります。ここに C++ を貼れば、ツールが一発で XML を出してくれます。すべてのフィールドが正しい位置に入ります。
コードは人間が読むように読みます。C++20 の designated initializer を使った struct Order { std::string orderId; std::vector<OrderItem> items; }; は <Order><orderId/><items><OrderItem/>...</items></Order> になり、ネストした struct はインラインで展開されます。std::string の値は正しくエスケープされ(よくある &, <, >, ", ')、数値型はリテラル表現を保ち、bool は true / false として出るので、標準準拠の XML リーダーが想定するどんなスキーマに対してもきれいにパースできます。
コンテナは手で書くときと同じ形に従います。std::vector<T>、std::array、素の C 配列は、要素型の名前を持つ子を各項目につけた親要素になります。std::map と std::unordered_map は <Entry><Key/><Value/></Entry> のペアを出します。nullopt を保持する std::optional は消えずに空要素になるので、ラウンドトリップでもスキーマの一貫性が保てます。コンストラクタ呼び出し、designated-initializer リテラル、型定義だけ — どれを貼っても対応します。
使い方
3 ステップ。単一の struct を貼っても、ヘッダーまるごと+サンプルインスタンスを貼ってもちゃんと動きます。
C++ を貼り付ける(またはサンプルを試す)
左のエディタに C++ をなんでも放り込んでください — struct 定義、メソッド付きの class、designated initializer、コンストラクタ呼び出し、どれでも。#include ヘッダー、コメント、using ディレクティブが混ざっていてもパーサーは戸惑いません。
サンプルインスタンス付きのきれいな struct を使いたい? サンプルを読み込む をクリックすると、C++20 の designated-initializer 構文を使った、OrderItem と Address がネストされたリアルな Order が入ります。
変換を押す
緑の 変換 ボタンをクリック。ツールが型を辿り、ネストした struct を展開し、XML を書き出します。処理中は短いローディング表示が出ます — たいてい 1〜2 秒もかかりません。
XML をコピー
右パネルに well-formed でインデント付きの XML が入ります。そのまま SOAP リクエスト、app.xml 設定ファイル、ユニットテスト用の std::ifstream フィクスチャ、pugixml の load_string テストにコピペできます — 妥当で、エスケープ済みで、すぐ使えます。
実際に役に立つ場面
SOAP / Web サービスのペイロードをプロトタイピング
レガシーな SOAP エンドポイント用の C++ リクエスト struct があって、SoapUI や curl に差し込むリアルな XML ボディが必要。struct を貼り、XML を取って、次へ。
pugixml / Xerces のテストフィクスチャを準備
XML ローダーのユニットテストには、いろんな well-formed ドキュメントが必要です。手で書くのは面倒くさい。実際の struct から生成すれば、フィクスチャがテスト対象の型と同期し続けます。
コードから設定テンプレートを作る
XML から設定を読むゲームエンジンや CAD ツール、シミュレーションは、C++ 側に Settings struct があるのが普通です。それを貼れば、リリースビルド用に編集可能な XML テンプレートが手に入ります — 手書きのボイラープレートは不要。
レガシー XML システムへの橋渡し
金融、医療、防衛のスタックは今も XML を話します。新しい C++ サービスが古いコンシューマーに XML メッセージを送らなきゃいけないとき、このツールが実際のシリアライザーを組む前に、どういう形になるべきかを見せてくれます。
よくある質問
複数の struct が入ったヘッダーファイルをまるごと貼れますか?
はい。ヘッダー全体を貼ってください — どの struct や class も通ります。ネストした型はインラインで展開され、基底クラスから継承した public メンバーも取り込まれます。パーサーはコメント、プリプロセッサディレクティブ、前方宣言に対して寛容です。
C++20 の designated initializer は理解しますか?
はい。Order order{ .orderId = "ORD-4821", .items = { ... } }; はフィールドごとにパースされるので、XML にはあなたが書いた名前が残ります。昔ながらの集成体初期化(位置指定の Order{ "ORD-4821", ... })も、同じ貼り付けに struct 定義があればフィールド名と位置を対応付けて動きます。cppreference の aggregate initialization を参照。
std::vector、std::map、std::optional はどう扱いますか?
std::vector<T>、std::array、素の C 配列は、要素型の名前を持つ子を各項目につけたコンテナ要素になります。std::map / std::unordered_map は <Entry><Key/><Value/></Entry> のペアを出します。nullopt の std::optional は消さずに空要素になるので、スキーマ上に要素は残ります。
pugixml や libxml2 を直接使えばよくないですか?
ランタイムのシリアライズにはどちらも素晴らしいです。でも最初のフィクスチャ — または設定テンプレートやドキュメントのサンプル — を書くとなると、結局 XML ツリーを手打ちすることになります。このツールはその最初のタイピングを省いてくれます。出力は後から pugixml、Xerces-C++、RapidXML のどれに流しても OK。
コードは保存されますか?
コードは変換のためにバックエンドに送られますが、永続化はしません — ペイロードはログに残していません。本当に機密性の高いコード(ゲームエンジンの独自内部、トレーディングモデルなど)なら、他のオンラインツールと同じく、貼る前に見直してください。
テンプレートやポインタ、スマートポインタがある場合は?
std::vector<int> のような具体的なテンプレートインスタンスはそのまま動きます。未解決のテンプレート引数(具体型のない template<typename T>)は空要素として出ます — 実データが欲しいなら具体型を指定してください。生ポインタや std::unique_ptr / std::shared_ptr はポイント先をたどります。ヌルポインタは変換全体を失敗させずに空要素になります。
合わせて使えるツール
C++ → XML はパズルの一ピース。これらと相性がいいです: