Perl から XML への変換ツール
Perl のパッケージやデータ構造を貼り付けると、きれいな XML が返ってきます。
このツールでできること
何かに XML を流し込む Perl を運用しているなら — 古い SOAP サービス、XML ベースの設定、CPAN 主導の連携など — あの儀式はおなじみでしょう。use XML::Simple、ForceArray と KeyAttr をいじり、手でハッシュリファレンスを組み立て、出力が相手の期待どおりであることを祈る。ここに Perl を貼り付ければ、整形式の XML を一発で返します — bless 済みオブジェクトでも、素のハッシュリファレンスでも、コンストラクターとアクセサ付きのパッケージ丸ごとでも大丈夫です。
この変換ツールは、よくある Perl の OO パターンをきれいに読み取ります。ハッシュリファレンスに対して bless $self, $class するコンストラクターは、ハッシュのキーをそのまま子要素にした XML 要素になります。配列リファレンスはコンテナ要素になり、各エントリごとに子要素が 1 つずつ入ります(子タグ名はキーの単数形になるので、items => [...] は <items><item/>...</items> になります)。ネストしたハッシュリファレンスはネストした要素になります。undef は捨てられずに空要素になるので、形は XML::Simple や XML::LibXML でラウンドトリップしたときと同じになります。
package Order; package OrderItem; package Address; のように、複数の package ブロックを一度に貼り付けることもできます。どのパッケージも、コンストラクターで割り当てられたフィールドが展開された形で出てきます。OO ではない素のデータ構造も動きます。my $data = { ... }; を渡せば、ツールがリファレンスをたどり、ハッシュキーを要素名としてそのまま保ちます。この裏にある Perl の細かいルールは、公式の perldoc が一次資料です。
使い方
3 ステップです。10 行のパッケージを貼っても、ヘルパー付きのフルモジュールを貼っても、やることは同じです。
Perl を貼り付け(またはサンプルを読み込み)
左のエディターにコードをそのまま入れてください。コンストラクター付きの package、素のハッシュリファレンス、ネストしたパッケージ、またはそれらの混在 — どれでも大丈夫です。まずは サンプルを読み込む を押して、現実的な例を見てみてください。
use strict;、use warnings;、require のリストなどを外す必要はありません。エディターに見えているままの形で貼ってください。貼るだけです。
「変換」を押す
緑の 変換 ボタンをクリック。ツールがパッケージ宣言を読み、bless 済みの参照を解決し、一発で XML を組み立てます。処理中は短いローディング表示が出ます。
XML をコピー
右側のパネルにインデント済み・整形式の XML が埋まります。規格準拠のパーサーならどれでも受け付けます。CPAN ワークフロー、レガシーな SOAP 連携、XML ベースの設定ファイル、テスト用フィクスチャなどにそのまま貼り付けてください。
実際に役立つ場面
XML::LibXML や XML::Simple に渡す前に形を確認
Perl のデータ構造があって、<code>XMLout</code> / <code>XML::LibXML::Document</code> を書き始める前に XML にしたときの形を正確に見たい。貼って、変換して、コピーして、見比べるだけです。
レガシーシステムとの連携
CPAN に依存した連携が今も SOAP 1.1 や独自の XML 形式を期待している。Perl の表現を貼り付ければ、SoapUI や curl に渡せる現実的なボディが得られます。
Perl からの脱却
古い Perl サービスを別の言語で置き換える?まずデータの形を XML として書き出してしまうのが楽です — Python、Java、C# に移す時の中立な足場になります。
コードと噛み合うドキュメント
<a href="https://metacpan.org/" target="_blank" rel="noopener">MetaCPAN</a> モジュールの README や社内 wiki 用の XML サンプルを、実際のパッケージからそのまま生成できます。ドキュメントがコードからずれません。
よくある質問
複数のパッケージを一度に貼っても大丈夫?
大丈夫です — .pm ファイル全体や、複数の package ブロックを連ねたものをそのまま貼ってください。各パッケージごとに、コンストラクターで割り当てられたハッシュキーが展開され、ネストしたオブジェクト参照も解決されて出てきます。Order が OrderItem オブジェクトの配列リファレンスと shipping_address ハッシュリファレンスを持っていれば、3 つとも出力に現れます。
undef や存在しないキーはどう扱う?
値が undef のキーは空要素になるので、インスタンスが変わっても XML の形が崩れません。ハッシュにそもそも存在しないキーは省かれます。空配列を持つ配列リファレンスは、捨てられずに空のコンテナ要素(<items></items>)になります。
配列リファレンスとハッシュリファレンスは同じ扱い?
配列リファレンスは、各エントリごとに子要素が 1 つずつ入るコンテナ要素になります。デフォルトでは子タグ名はキーの単数形なので、items => [...] は <items><item/>...</items> になります。ハッシュリファレンスは、キーをそのまま子要素名にしたネスト要素になります。混在したもの(ハッシュの配列、配列のハッシュなど)も同じルールで再帰的にネストします。
bless 済みの参照や多重継承は?
bless された参照はクラス名が取れるので、意味がある場合は要素タグとして使えます。@ISA や Moose/Moo のロールによる多重継承では、最終的に合成されたオブジェクトの属性がそのまま出力されます。継承グラフ自体を XML に再構築することはしません。
コードは保存されますか?
変換のためにバックエンドへ送りますが、保存はしません — ペイロードもログしません。Perl が機微なもの(リテラルの認証情報、社内 URL など)であれば、他のオンラインツールと同じように、貼り付ける前にさっと確認してください。
サブルーチンリファレンスや tie を使っていたら?
コードリファレンスや tied 変数は、変換全体を失敗させずに空要素として出力します。構造のデータ部分はちゃんと出てきます。コード自体に構文エラーがある場合は、まずわかりやすいところを直して、パーサーがきれいな入力を読めるようにしておいてください。
合わせて使えるツール
Perl から XML はパズルのピースのひとつです。こんなツールと相性が良いです: