左に Perl を貼り付けて 「変換」 をクリック — XML に変換しますPerl コードを貼り付け

このツールでできること

何かに XML を流し込む Perl を運用しているなら — 古い SOAP サービス、XML ベースの設定、CPAN 主導の連携など — あの儀式はおなじみでしょう。use XML::SimpleForceArrayKeyAttr をいじり、手でハッシュリファレンスを組み立て、出力が相手の期待どおりであることを祈る。ここに Perl を貼り付ければ、整形式の XML を一発で返します — bless 済みオブジェクトでも、素のハッシュリファレンスでも、コンストラクターとアクセサ付きのパッケージ丸ごとでも大丈夫です。

この変換ツールは、よくある Perl の OO パターンをきれいに読み取ります。ハッシュリファレンスに対して bless $self, $class するコンストラクターは、ハッシュのキーをそのまま子要素にした XML 要素になります。配列リファレンスはコンテナ要素になり、各エントリごとに子要素が 1 つずつ入ります(子タグ名はキーの単数形になるので、items => [...]<items><item/>...</items> になります)。ネストしたハッシュリファレンスはネストした要素になります。undef は捨てられずに空要素になるので、形は XML::SimpleXML::LibXML でラウンドトリップしたときと同じになります。

package Order; package OrderItem; package Address; のように、複数の package ブロックを一度に貼り付けることもできます。どのパッケージも、コンストラクターで割り当てられたフィールドが展開された形で出てきます。OO ではない素のデータ構造も動きます。my $data = { ... }; を渡せば、ツールがリファレンスをたどり、ハッシュキーを要素名としてそのまま保ちます。この裏にある Perl の細かいルールは、公式の perldoc が一次資料です。

使い方

3 ステップです。10 行のパッケージを貼っても、ヘルパー付きのフルモジュールを貼っても、やることは同じです。

1

Perl を貼り付け(またはサンプルを読み込み)

左のエディターにコードをそのまま入れてください。コンストラクター付きの package素のハッシュリファレンスネストしたパッケージ、またはそれらの混在 — どれでも大丈夫です。まずは サンプルを読み込む を押して、現実的な例を見てみてください。

use strict;use warnings;require のリストなどを外す必要はありません。エディターに見えているままの形で貼ってください。貼るだけです。

2

「変換」を押す

緑の 変換 ボタンをクリック。ツールがパッケージ宣言を読み、bless 済みの参照を解決し、一発で XML を組み立てます。処理中は短いローディング表示が出ます。

3

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 ブロックを連ねたものをそのまま貼ってください。各パッケージごとに、コンストラクターで割り当てられたハッシュキーが展開され、ネストしたオブジェクト参照も解決されて出てきます。OrderOrderItem オブジェクトの配列リファレンスと 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 はパズルのピースのひとつです。こんなツールと相性が良いです: