[JSON] xml2json.pl - XMLファイルをJSONに変換するスクリプト

↓は RSS/RDF/Atom 専用のためアイテム件数制限や要素制限の処理が入っていたので、
スクリプトが少し長くなってしまっていたけど、フィードに限らず汎用化して
単に XML ファイルを JSON 変換するだけなら、もっと単純になると思った。

http://kawa.at.webry.info/200605/article_1.html
rss2json.pl
クライアント側 JavaScript では、XML.ParseXML を利用しています。
サーバ側 Perl では、XML::FeedPP を使って JSON に変換しました。
参考に、RSS→JSON 変換のスクリプトを置いておきます。

以下が XML→JSON 変換のスクリプト。
JSON で出力しておけば、JavaScript 側で XML.ObjTree とかを使って
XML を JavaScript オブジェクトに展開する必要がなくなって速いです。

#!/usr/bin/perl
# xml2json.pl
# Copyright 2006 Yusuke Kawasaki http://www.kawa.net/

use strict;
use XML::TreePP;
use JSON::Syck;

my $xml = shift @ARGV || '-';
my $json = shift @ARGV || '-';

my $tpp = XML::TreePP->new();
$tpp->set( force_array => [ 'rdf:li', 'item', 'entry' ] );
$tpp->set( attr_prefix => '@' );
my $tree = $tpp->parsefile( $xml );
my $text = JSON::Syck::Dump( $tree );

open( OUT, "> $json" ) or die "$! - $json\n";
print OUT $text;
close( OUT );

XML::TreePP・JSON::Syck は CPAN でインストールする必要があります。

第1引数が入力XMLファイル名、第2引数が出力JSONファイル名です。
perl xml2json.pl input.xml output.json
のように使用します。
引数を省略した場合は、標準入出力『-』を使います。

7:    use JSON::Syck;
16:   my $text = JSON::Syck::Dump( $tree );
        ↓
7:    use JSON;
16:   my $text = JSON::objToJson( $tree );
と変更すれば、Audrey さんの JSON::Syck じゃなくて Pure Perl 実装の
JSON モジュールを使えます。
XML::TreePP も Pure Perl なので、CPAN がない環境でも利用できます。

13:   $tpp->set( force_array => [ 'rdf:li', 'item', 'entry' ] );
には「複数登場することが予め分かっている要素名」を並べると吉です。
指定しなくても自動判別してくれるので、必須ではないです。

14:   $tpp->set( attr_prefix => '@' );
XML要素の属性名の先頭につけるプリフィックスを指定します。
デフォルトは「-」なので、JSON用ならE4X風に「@」指定が今のオススメです。

15:   my $tree = $tpp->parsefile( $xml );
        ↓
15:   my $tree = $tpp->parsehttp( GET => $xml );
と変更すれば、サーバ上のXMLファイルを拾って来ます。
XMLHTTPRequest ではないので、もちろん外のサーバにもアクセスできます。
XML→JSON のプロキシサービスとかもスグ作れますね。
(プロキシは不正利用されないようにURL制限とか入れる必要があるけど)

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック