C# から XML へのコンバーター
C# のクラスやオブジェクトを貼り付ければ、きれいな XML を返します。
このツールでできること
SOAP 呼び出し、設定ファイル、WCF コントラクト、テストフィクスチャのために C# クラスと同じ形の XML ペイロードを手で組んだことがある方なら、その面倒くささはご存じのはず。ここに C# を貼り付ければ、整形式の XML が一度で返ります。単一の オブジェクト初期化子でも、複数クラスを含むモデルファイル全体でも、深くネストされた構造でも結果は同じ。全プロパティを保った完全な XML ドキュメントが得られます。
単純な文字列置換ではありません。C# が実際にどう XML にシリアライズされるかを踏まえて変換します。49.99m のような decimal のサフィックスは m が外れ、DateTime と DateTimeOffset は ISO-8601 文字列に、Guid は標準的な 8-4-4-4-12 形式の 16 進文字列に、null 値の nullable は空要素になります。コレクションは XmlSerializer が出力するのと同じ形に — List<T> は要素型の名前を持つ子要素を 1 つずつ持つコンテナ要素になります。
シリアライズ属性もそのまま反映されます。[XmlRoot("x")] はルート要素の名前を変更し、[XmlElement("x")] は子要素の名前を変更、[XmlAttribute("x")] はプロパティを要素ではなく属性として出力し、[XmlIgnore] はそれを除外します。DataContract クラスの [DataMember(Name="x")] も同様に動きます。複数クラスを貼り付けると、それぞれが出力に現れ、ネストされた型は展開され、継承プロパティも取り込まれます。気づかないうちに欠落することはありません。
使い方
3 ステップです。5 行貼り付けても、モデルファイル丸ごと貼り付けても動作は同じです。
C# を貼り付ける(またはサンプルを試す)
左のエディターに C# をそのまま貼り付けてください。オブジェクト初期化子、クラス定義全体、複数のクラス、ネストされた型、どれも問題ありません。先に実例を見たい場合は Load Sample をクリック。
コメントを消したり、属性を外したり、C# の構文を整える必要はありません。IDE で見えているままのコードで OK。ただ貼り付けるだけです。
「変換」を押す
緑の Convert ボタンをクリック。ツールは C# を読み取り、すべてのクラスとプロパティを保持したまま、一度のパスで XML を組み立てます。実行中は短いローディングが表示されます。
XML をコピーする
右のパネルにはインデント済みの整形式 XML が表示されます。規格準拠の XML パーサーでそのまま受け入れられる形です。そのまま SOAP リクエスト、設定ファイル、テストフィクスチャ、ドキュメントに貼り付けてください。
こんなときに役立ちます
SOAP / WCF フィクスチャを作る
C# のリクエストコントラクトがあり、SoapUI や Postman に貼る XML ボディが欲しい。クラスを貼り付けて、XML を受け取って、次の作業へ。
設定ファイルのひな形を作る
40 個のプロパティを持つ Settings クラスが、app.config、web.config、その他 XML ベースの設定ストア向けに編集可能な XML テンプレートに。手書きのボイラープレートは不要です。
ドキュメントを同期させる
README、API リファレンス、XSD ベースのスキーマドキュメント用の XML サンプルを、実際のモデルから直接生成。ドキュメントがコードに追随します。
テストデータを用意する
ユニットテストのオブジェクト初期化子を、結合テストやモックサーバー、今も XML を使うレガシーシステム向けの XML シードファイルに変換できます。
よくある質問
複数のクラスを一度に貼り付けられますか?
はい — ファイル丸ごと貼り付けて大丈夫です。トップレベルの各クラスは、ネストされた型を展開し、基底クラスから継承したプロパティも含めて出力されます。抜け落ちはありません。
[XmlElement]、[XmlAttribute]、[XmlIgnore] といった属性には対応していますか?
はい。[XmlRoot("x")] はルート要素の名前を変更し、[XmlElement("x")] は子要素の名前を変更、[XmlAttribute("x")] はプロパティを親要素の属性として出力し、[XmlIgnore] はそれを完全に除外します。DataContract クラスの [DataMember(Name="x")] も要素名を変更します。XmlSerializer と同じ挙動です。
decimal、DateTime、Guid、nullable はどう扱われますか?
decimal(49.99m)はサフィックスが外れてただの数値テキストになります。DateTime と DateTimeOffset は ISO-8601 文字列に、Guid は 8-4-4-4-12 形式の標準 16 進文字列に、TimeSpan は ISO-8601 の期間か HH:mm:ss になります。null 値の nullable は破棄されずに空要素として出力されるので、形が一貫します。
ネストされたクラス、List、Dictionary はどうなりますか?
List<T>、配列、HashSet<T>、IEnumerable<T> はすべて要素型の名前の子要素を 1 つずつ持つコンテナ要素になります — List<OrderItem> Items は <Items><OrderItem/><OrderItem/></Items> に。Dictionary<K,V> は <Entry><Key/><Value/></Entry> のコンテナになります。ネストされたオブジェクト初期化子は、すべてのフィールドをそのまま残してネストされた要素として展開されます。
貼り付けたコードは保存されますか?
コードは変換のためにバックエンドに送信されますが、保存はされません — ペイロードのログも取っていません。オンラインツール全般に言えることですが、本当に機密性の高いコードなら、貼る前に一度目を通してください。
メソッド、delegate、IntPtr のような変わった要素が C# に含まれている場合は?
そうした要素は変換全体を失敗させずに空要素として出力されるので、モデルの残りの部分はちゃんと通ります。コード自体に構文エラーがある場合は、明らかなものだけでも先に直してください — パーサーは寛容ですが、魔法ではありません。
一緒に使うと便利なツール
C# から XML への変換はパズルの一片に過ぎません。相性のよいツールを紹介します。