ブログ  前の月  次の月 

たけまる / 2007-03


2007-03-31 Sat

_ Atom 0.3 と 1.0 の相互変換 [atom][perl]

Perl で RSS や Atom を変換するには,XML::Feed や XML::FeedPP が使
えます.たとえば,plagger では XML::Feed が使われています.個人的
には変換速度の速い XML::FeedPP を使っています.

[Perl] XML::FeedPP - RSS・RDF・Atomフィードの解析・生成・変換・結合

ところで,RSS や RDF と Atom を変換することはできるのですが,Atom
0.3 と 1.0 の変換はサポートしていませんでした.XML::FeedPP を Atom
1.0 に対応させるパッチを作りましたので紹介です.

FeedPP v.0.21 の Atom 1.0 対応パッチ

以下のようにして,Atom 0.3 から 1.0 に変換できます.逆も同様です.

my $atom10 = XML::FeedPP::Atom1_0->new;
$feed->merge( $atom03_xml );
$feed->to_string( 'UTF-8' );

作者の川崎さんにパッチを送ったので,近いうちに取り込まれると思いま
す (モジュール名が XML::FeedPP::Atom1_0 から変更されるかもしれませ
んので注意してください).

■ 追記

XML::Feed は,Atom 0.3 から 1.0 への片道変換のみサポートしています.

XML::Feed->parse( \$atom03_xml )->convert('Atom')->as_xml;

逆変換するには,XML::Feed::Atom にハードコーディングされている
'1.0' という文字列を '0.3' にすればよいと思われます.

2007-03-29 Thu

_ Atom 0.3 と 1.0 の相異点 [atom]

Atom 0.3 と 1.0 の相異点を見やすく示したサイトがなかったので,まと
めておくことにしました.下が対応表になります (XPath で書いてありま
す).空白は,対応する要素がないということです.

■ 要素・属性名の対応
Atom0.3 Atom1.0
//tagline //subtitle
//copyright //rights
//generator/@url //generator/@uri
//info
//modified //updated
//issued //published
//created
//link/@hreflang
//link/@length
//category
//author/url //author/uri
//content/@mode

■ //content/@type の対応
Atom0.3 Atom1.0
text/plain text
text/html html

Atom 0.3 には category 要素がなかったため,Dublin Core の subject
要素で代用することが多かったようです.

詳細については以下のページが参考になります (英語ですが).
rakaz - Moving from Atom 0.3 to 1.0

2007-03-07 Wed

_ Perl - XML の処理はどれが速いかベンチ [perl][xml]

XML を多量に読み書きする予定なので,処理速度を調べてみることにしま
した.

パース速度については,昔の naoya さんの記事が参考になります.

Perl で XML の処理はどれが速いかベンチ : NDO::Weblog

RSS を対象としたベンチマークでは,正規表現が最速,次いで
XML::LibXML とのことです.

XML::Atom の性能を知りたかったので,同じ試験を Atom でやってみまし
た.XML::Atom は内部で XML::LibXML を使っています.

Benchmark: timing 10000 iterations of XML::Atom, XML::LibXML, XML::Simple, regexp...
 XML::Atom:  4 wallclock secs ( 3.58 usr +  0.00 sys =  3.58 CPU) @ 2793.30/s (n=10000)
XML::LibXML:  2 wallclock secs ( 2.22 usr +  0.00 sys =  2.22 CPU) @ 4504.50/s (n=10000)
XML::Simple: 52 wallclock secs (51.03 usr +  0.48 sys = 51.51 CPU) @ 194.14/s (n=10000)
    regexp:  0 wallclock secs ( 0.06 usr +  0.00 sys =  0.06 CPU) @ 166666.67/s (n=10000)
            (warning: too few iterations for a reliable count)

テストデータには,entry をひとつだけ含むシンプルなものを使いました.
XML::Atom の速度は,XML::LibXML + overhead くらいの結果となりまし
た.保守性を考えると,XML::Atom を拡張して使うのは悪くなさそうです.

さて,出力処理は軽いので気にしなくてよいと思うのですが,念のため確
認してみました.比較対象は XML::Simple, XML::Atom, TT です.

        TT: 11 wallclock secs ( 3.77 usr +  0.19 sys =  3.96 CPU) @ 2525.25/s (n=10000)
 XML::Atom: 10 wallclock secs ( 9.80 usr +  0.00 sys =  9.80 CPU) @ 1020.41/s (n=10000)
XML::Simple:  6 wallclock secs ( 6.26 usr +  0.00 sys =  6.26 CPU) @ 1597.44/s (n=10000)

パースほど差はつきませんでしたが,TT がやや速い結果となりました.
TT と XML::Simple は名前空間などのオーバヘッドがないと思うので,そ
の分速いのでしょう.実装がラクなことを考えても,TT がベストの選択
肢になりそうです.

XML::Atom は,意外にもパースのが速かったりします.

以下は,ベンチマークスクリプトです.

続きを読む